SML:如果 -> 是右结合的
SML: If -> is right associative
Ullman 的书,ML 编程基础,介绍了定义如下的 map 函数的简单版本:
fun simpleMap(F, nil) = nil
| simpleMap(F, x::xs) = F(x)::simpleMap(F, xs);
val map = fn : ('a -> 'b) * 'a list -> 'b list
鉴于 -> 是右结合的,你不会像这样加上括号:
('a -> 'b) * ('a list -> 'b list) ?
但这是不正确的,因为域类型是由函数和列表组成的元组,而范围类型只是一个列表。
我哪里错了?
谢谢!
在 SML 中,类型运算符 *
比 ->
绑定得更紧密:它具有更高的优先级,就像 *
在算术中比 +
具有更高的优先级一样.
这就是 string * string -> string
与 (string * string) -> string
而不是 string * (string -> string)
相同的原因。要阅读您的示例,我们需要在 *
两边加上括号,然后再担心 ->
如何关联:
(('a -> 'b) * 'a list) -> 'b list
Ullman 的书,ML 编程基础,介绍了定义如下的 map 函数的简单版本:
fun simpleMap(F, nil) = nil
| simpleMap(F, x::xs) = F(x)::simpleMap(F, xs);
val map = fn : ('a -> 'b) * 'a list -> 'b list
鉴于 -> 是右结合的,你不会像这样加上括号:
('a -> 'b) * ('a list -> 'b list) ?
但这是不正确的,因为域类型是由函数和列表组成的元组,而范围类型只是一个列表。
我哪里错了?
谢谢!
在 SML 中,类型运算符 *
比 ->
绑定得更紧密:它具有更高的优先级,就像 *
在算术中比 +
具有更高的优先级一样.
这就是 string * string -> string
与 (string * string) -> string
而不是 string * (string -> string)
相同的原因。要阅读您的示例,我们需要在 *
两边加上括号,然后再担心 ->
如何关联:
(('a -> 'b) * 'a list) -> 'b list