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