我一直在试图理解SML中的高阶函数。我知道如何写简单的高阶函数,也能理解签名。一个例子是:
fun increment list = map (fn x=> x + 1) list;
val it = fn: int list -> int list但是,我无法理解以下高阶函数的签名:
fun add x y = x + y;
val add = fn: int -> int -> int该函数可编写为:
fun add (x,y) = x+y;
val add: fn : (int * int) -> int 我能理解。但在前面的函数中,我无法理解操作的顺序是如何工作的。该函数是同时接受两个参数,还是每次使用一个参数生成一个新函数,然后生成所需的结果?对于任何其他高阶函数,它将如何工作?
我需要为我的家庭作业和几个星期后的考试建立一个关于高阶函数签名的概念。
发布于 2014-10-08 17:13:01
在SML中,函数可以被匆匆处理。
- fun add x y = x + y
val add = fn : int -> int -> int是咖喱的。这意味着可以部分应用,如下所示:
- fun add2 x = add 2 x;
val add2 = fn: int -> int
- add2 3;
val it = 5 : int如果我们将函数编写为:
- fun add2tuple(x,y) = x + y;
val add2tuple = fn : (int * int) -> int我们实际上不是传递两个参数,而是传递一个元组。元组包含两个整数是元组类型的描述。
fun f p1 p2 ... pn = ...可以通过传递1到n-1参数来部分应用。但是,参数为单个元组的函数不能部分应用。
- 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这个例子可能会说明元组是一个单一的东西:
- 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希望你喜欢丹·格罗斯曼的课。
发布于 2014-10-08 12:44:32
要记住的一件事是,所有SML函数都有一个参数。这个参数可能是一对,如在第二个add函数中,或者在一个int中,就像在第一个add函数中一样。正确的是,第一个add返回类型为int -> int的函数。你也可以写
fun add1 x = fn y => x + y这更清楚地表明,它需要一个单一的论点。甚至
val add1 = fn x => fn y => x + y(FWIW,您的double函数看起来有点奇怪。它忽略它的参数,每次都返回相同的结果。
fun increment list = map (fn x => x + 1) list可能就是你的意思。)
https://stackoverflow.com/questions/26256646
复制相似问题