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…
。也就是说,三参数函数的版本,而不是元组函数。返回函数的函数在类型签名中包含更多的->
。请参阅。