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