fn:('a->'b)*('a->'b)*'a list->'b list和fn:('a->'b)->('a- >'b)->'a列表->'b列表

时间:2018-10-07 11:09:45

标签: sml smlnj

我写了一个函数

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

那有什么不同?

1 个答案:

答案 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 。返回函数的函数在类型签名中涉及更多->