咖喱功能问题(SML / NJ)

时间:2013-09-24 18:59:16

标签: functional-programming sml smlnj currying

  

我们常常对计算f(i)i =mnΣ,函数之和感兴趣   i = m到n的值f(i)。定义计算的'sigma f m n'   f(i)i =mnΣ。这与定义'sigma(f,m,n)'

不同

我需要写一个这个函数的Curried版本。我在理解这实际上是如何工作时遇到了一些麻烦。我知道Curry函数是一个函数,它产生一个函数。这会是咖喱功能的一个例子吗?

fun myCurry f x = f(x)

就设置我的问题而言,这是一个可以接受的开始吗?

fun sigma f m n =

我还没有进一步,因为我无法理解我被要求做的事情。

1 个答案:

答案 0 :(得分:7)

实际上,curried函数不是一个函数,它接受一个函数并产生另一个函数。这是一个更高阶的函数。

curried函数只是一个带有多个参数的函数,只能通过给它一个参数来部分应用。

例如,有了你的sigma问题,

fun sigma (f,m,n) = ...

不是curried函数,因为它只需要一个参数(元组(f,m,n)。)

fun sigma f m n = ...
然而,

是一个curried函数,因为它需要三个参数,并且可以说类似

val sigmasquare = sigma (fn x => x * x)

,通过给它第一个参数来部分应用sigma。

一个更简单的例子是

fun add (x,y) = x + y

这是一个非常规的功能。要对其进行评估,您必须为其提供参数,其中包括xy。在这种情况下,add (3,5)将评估为8。

fun add x y = x + y

是同一功能的curried版本。只需给它x即可对此进行部分评估。例如,add 3将计算一个函数,该函数将为其参数添加三个。

通过将前面的示例视为匿名或lambda函数,可以更清楚地看到这一点。

第一个相当于fn (x,y) => x + y,它显然需要两个整数并计算为一个int。

第二个等价于fn x => fn y => x + y,它接受​​一个int并计算一个带另一个int并计算为int的函数。

因此,第一个类型为(int * int) -> int,而第二个类型为int -> int -> int

希望这有点清楚地说明了。