Sml fn:(';a->;';b)*(';a->;';b)*';列表->';b列表和fn:(&x27;a->;&x27;b)>;(';a->;';b)>';列表->';b名单

Sml fn:(';a->;';b)*(';a->;';b)*';列表->';b列表和fn:(&x27;a->;&x27;b)>;(';a->;';b)>';列表->';b名单,sml,smlnj,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

我写了一个函数

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

那么有什么不同呢?

您删除了一对括号,并添加了另外两个

(fa):(map\u alternate g f rest)
中的括号没有区别。它们可以省略

括号中的括号

fun map_alternate (f, g, lst) =
    case lst of
        []   => []
      | a::b => f a ::  map_alternate (g, f, lst)
实际上带有a的含义:这个函数接受一个参数,一个3元组,模式匹配每三个组件,并最终通过修改该3元组(交换第一个和第二个元素)来调用自己

相反,功能

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
and是一个函数,它接受一个参数
f
,并返回一个函数,该函数接受一个参数
g
,并返回一个函数,该函数接受一个参数
lst
,并返回
的case lst of…
。也就是说,三参数函数的版本,而不是元组函数。返回函数的函数在类型签名中包含更多的
->

请参阅。