首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fn:('a -> 'b) * ('a -> 'b) * 'a list -> 'b list和fn:('a -> 'b) -> ('a -> 'b) -> 'a list -> 'b list有区别吗

fn:('a -> 'b) * ('a -> 'b) * 'a list -> 'b list和fn:('a -> 'b) -> ('a -> 'b) -> 'a list -> 'b list有区别吗
EN

Stack Overflow用户
提问于 2018-10-07 19:09:45
回答 1查看 38关注 0票数 0

我写了一个函数

代码语言:javascript
复制
fun map_alternate (f,g,lst) =
    case lst of
        []   => []
      | a::b => f a ::  map_alternate (g, f, lst)

其类型为:

代码语言:javascript
复制
 ('a -> 'b) * ('a -> 'b) * 'a list -> 'b list

但是当我像这样改变括号的时候

代码语言:javascript
复制
fun map_alternate f g lst =
    case lst of
         []   => []
       | a::b => (f a) :: (map_alternate g f rest)

它会产生不同的类型:

代码语言:javascript
复制
fn : ('a -> 'b) -> ('a -> 'b) -> 'a list -> 'b list

那么有什么不同呢?

EN

回答 1

Stack Overflow用户

发布于 2018-10-08 12:24:04

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

(f a) :: (map_alternate g f rest)中的括号没有区别。它们可以省略。

中的括号

代码语言:javascript
复制
fun map_alternate (f, g, lst) =
    case lst of
        []   => []
      | a::b => f a ::  map_alternate (g, f, lst)

实际上带有a的含义:这个函数接受一个参数,一个三元组,模式匹配每三个组件,最终通过修改那个三元组来调用自己(第一个和第二个元素互换)。

相比之下,函数

代码语言:javascript
复制
fun map_alternate f g lst =
    case lst of
         []   => []
       | a::b => f a :: map_alternate g f rest

有着不同的含义。它等同于

代码语言:javascript
复制
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 ...的函数。也就是说,是三参数函数的版本,而不是元组。返回函数的函数在类型签名中涉及更多的->

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52687897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档