SML:括号函数类型的严格方法

SML: Rigorous Way To Parenthesize Function Type

我在弄清楚如何给函数加上括号时遇到了一些困难(当在某些部分周围添加括号以使含义更清楚是合法的时候)。

例如,foldl 被定义为具有类型:

foldl : ('a * 'b -> 'b) -> b -> 'a list -> 'b

现在,如果我查看 foldl 的定义,我会看到:

fun foldl g z [] = z
    | foldl g z (x::L) = foldl g (g(x,z)) L;

基于此,我通常只是在脑海中将 g 映射到 ('a * 'b -> 'b),将 z 映射为 'b 类型,模式匹配负责处理列表类型 'a list。最后,return类型是'b.

但是,我认为 -> 是正确的联想,所以最自然的开始是说“好的,像这样添加括号:

foldl : ('a * 'b -> 'b) -> 'b -> ('a list -> 'b)

这种思路有什么问题/我对如何添加括号有什么误解?

没什么问题,就是多余

('a * 'b -> 'b) -> 'b -> ('a list -> 'b)('a * 'b -> 'b) -> ('b -> ('a list -> 'b))('a * 'b -> 'b) -> 'b -> 'a list -> 'b 都是等价的 因为 -> 是右结合的。所以我们通常写括号最少的版本(就像一个人通常写 3 - 2 - 1 而不是等价的 (3 - 2) - 1)。