2015-08-14 19 views
1

我在计算如何将函数加括号(当在某些部分的周围添加括号以使意思更清晰时是合法的)时遇到了一些困难。SML:严格的加括号功能类型的方法

例如,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的列表。最后,返回类型为'b

不过,我想->正确的同伙,所以说“OK,加括号像这样开始不会是最自然的:

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

有什么不对这一思路/我是什么误解有关如何添加括号?

回答

4

有没有错,它只是多余的。

('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)。