我写了一个函数
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
那有什么不同?
答案 0 :(得分:1)
您删除了一对括号,并添加了另外两个。
(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)
实际上带有一个含义:该函数采用 one 参数,一个三元组,模式匹配每三个组成部分,并最终对该三元组进行修改(使用第一个和第二个)元素互换)。
相反,功能
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 ...
的函数的函数。也就是说,是三参数函数的curried版本,而不是 tupled 。返回函数的函数在类型签名中涉及更多->
。