Functional programming SML:插入函数类型的严格方法

Functional programming SML:插入函数类型的严格方法,functional-programming,sml,Functional Programming,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),

我在弄清楚如何用括号括起一个函数时遇到了一点困难(如果在某些部分周围添加括号以使含义更清楚是合法的)

例如,
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

然而,我认为
->
是正确的伙伴,所以最自然的做法不是说“好的,像这样添加括号:

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

它没有什么问题,只是多余的

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