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
)