我写了一个函数
fun map_alternate (f,g,lst) =
case lst of
[] => []
| a::b => f a :: map_alternate (g, f, lst)其类型为:
('a -> 'b) * ('a -> 'b) * 'a list -> 'b list但是当我像这样改变括号的时候
fun map_alternate f g lst =
case lst of
[] => []
| a::b => (f a) :: (map_alternate g f rest)它会产生不同的类型:
fn : ('a -> 'b) -> ('a -> 'b) -> 'a list -> 'b list那么有什么不同呢?
发布于 2018-10-08 12:24:04
您删除了一对括号,并添加了另外两对括号。
(f a) :: (map_alternate g f rest)中的括号没有区别。它们可以省略。
中的括号
fun map_alternate (f, g, lst) =
case lst of
[] => []
| a::b => f a :: map_alternate (g, f, lst)实际上带有a的含义:这个函数接受一个参数,一个三元组,模式匹配每三个组件,最终通过修改那个三元组来调用自己(第一个和第二个元素互换)。
相比之下,函数
fun map_alternate f g lst =
case lst of
[] => []
| a::b => f a :: map_alternate g f rest有着不同的含义。它等同于
val rec map_alternate = fn f => fn g => fn lst =>
case lst of
[] => []
| a::b => f a :: map_alternate g f rest和是一个接受参数f的函数,返回一个接受参数g的函数,并返回一个接受参数lst并返回case lst of ...的函数。也就是说,是三参数函数的版本,而不是元组。返回函数的函数在类型签名中涉及更多的->。
https://stackoverflow.com/questions/52687897
复制相似问题