首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何得到‘int -> (int -> int)’?

如何得到‘int -> (int -> int)’?
EN

Stack Overflow用户
提问于 2014-07-07 07:35:36
回答 3查看 699关注 0票数 0

这两种类型:int -> int -> intint -> (int -> int)是否相同?

如果我编写let f x = fun y -> x + y + 1,utop将返回int -> int -> int。但是我想要的是一个函数,它以int作为参数,然后返回一个函数,该函数也接受int并返回int,即int -> (int -> int)

有办法吗?

同样对于(’a * ’b -> ’c) -> (’a -> ’b -> ’c),我编写了let f g = fun a b -> g (a,b),但是它返回(’a * ’b -> ’c) -> ’a -> ’b -> ’c,括号被去掉。但是为什么呢?

如果结果返回一个新函数,它是否会被匆忙处理?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-07 07:50:42

通常,在lambda-微积分中,所有函数都有一个参数.接受两个参数(而不是元组)的函数是接受1个参数并返回另一个函数的函数。如果你从这个角度来看待这个问题,你就会明白->是正确的联想。

票数 2
EN

Stack Overflow用户

发布于 2014-07-07 09:15:17

是的,它们是一样的。箭头是一个右关联的infix构造函数,这就是为什么右边的括号是多余的。

认识到这一点也许是有帮助的

代码语言:javascript
复制
let f x y z = e

是简单的语法糖

代码语言:javascript
复制
let f = fun x -> fun y -> fun z -> e

其他的一切都是从那里开始的。

票数 2
EN

Stack Overflow用户

发布于 2014-07-07 08:41:58

是的,他们是一样的。

你可以试一试,只要输入

代码语言:javascript
复制
let f x y = x + y + 1;;
val f : int -> int -> int = <fun>
# let g = f 1;;
val g : int -> int = <fun>
# let _ = List.map g [1;2;3];; (* would do the same with (f 1) instead of g *)
- : int list = [3; 4; 5]

整个想法是,在默认情况下,函数是并发的。由于a -> ( b -> c )a -> b -> c是等价的,它们被显示为可能最轻的类型。

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

https://stackoverflow.com/questions/24605234

复制
相关文章

相似问题

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