首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SML中高阶函数的签名

SML中高阶函数的签名
EN

Stack Overflow用户
提问于 2014-10-08 12:13:56
回答 2查看 328关注 0票数 1

我一直在试图理解SML中的高阶函数。我知道如何写简单的高阶函数,也能理解签名。一个例子是:

代码语言:javascript
复制
fun increment list = map (fn x=> x + 1) list;
val it = fn: int list -> int list

但是,我无法理解以下高阶函数的签名:

代码语言:javascript
复制
fun add  x y = x + y;
val add = fn: int -> int -> int

该函数可编写为:

代码语言:javascript
复制
fun add (x,y) = x+y;
val add: fn : (int * int) -> int 

我能理解。但在前面的函数中,我无法理解操作的顺序是如何工作的。该函数是同时接受两个参数,还是每次使用一个参数生成一个新函数,然后生成所需的结果?对于任何其他高阶函数,它将如何工作?

我需要为我的家庭作业和几个星期后的考试建立一个关于高阶函数签名的概念。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-08 17:13:01

在SML中,函数可以被匆匆处理。

代码语言:javascript
复制
  - fun add x y = x + y
  val add = fn : int -> int -> int

是咖喱的。这意味着可以部分应用,如下所示:

代码语言:javascript
复制
  - fun add2 x = add 2 x;
  val add2 = fn: int -> int
  - add2 3;
  val it = 5 : int

如果我们将函数编写为:

代码语言:javascript
复制
  - fun add2tuple(x,y) = x + y;
  val add2tuple = fn : (int * int) -> int

我们实际上不是传递两个参数,而是传递一个元组。元组包含两个整数是元组类型的描述。

  • 如果我们用咖喱形式编写函数,那么函数参数就不会放在元组中。
  • 在咖喱形式中,函数fun f p1 p2 ... pn = ...可以通过传递1到n-1参数来部分应用。

但是,参数为单个元组的函数不能部分应用。

代码语言:javascript
复制
- fun addordered x y = x + (2 * y);
val addordered = fn : int -> int -> int
- addordered 2 3;
val it = 8 : int
- fun addordered2 x = addordered x 2;
val addordered2 = fn : int -> int
- addordered2 3;
val it = 7 : int

这个例子可能会说明元组是一个单一的东西:

代码语言:javascript
复制
- fun add3tuple(x,y,z) = x + y;
val add3tuple = fn : int * int * 'a -> int
- add3tuple(3,4,5);
val it = 7 : int
- add3tuple(3,4,"Hello World");
val it = 7 : int

希望你喜欢丹·格罗斯曼的课。

票数 1
EN

Stack Overflow用户

发布于 2014-10-08 12:44:32

要记住的一件事是,所有SML函数都有一个参数。这个参数可能是一对,如在第二个add函数中,或者在一个int中,就像在第一个add函数中一样。正确的是,第一个add返回类型为int -> int的函数。你也可以写

代码语言:javascript
复制
fun add1 x = fn y => x + y

这更清楚地表明,它需要一个单一的论点。甚至

代码语言:javascript
复制
val add1 = fn x => fn y => x + y

(FWIW,您的double函数看起来有点奇怪。它忽略它的参数,每次都返回相同的结果。

代码语言:javascript
复制
fun increment list = map (fn x => x + 1) list

可能就是你的意思。)

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

https://stackoverflow.com/questions/26256646

复制
相关文章

相似问题

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