【问题标题】:Trouble with Curry functions (SML/NJ)Curry 函数出现问题 (SML/NJ)
【发布时间】:2013-09-30 03:43:27
【问题描述】:

我们通常对计算 f(i) i=m n∑ 感兴趣,即函数的总和 i = m 到 n 的值 f(i)。定义计算的‘sigma f m n’ f(i) i=m n∑ 。这与定义‘sigma (f, m, n)’不同

我需要编写此函数的 Curried 版本。我很难理解这实际上是如何工作的。我知道 Curry 函数是接受一个函数并产生一个函数的东西。这会是咖喱函数的一个例子吗?

fun myCurry f x = f(x)

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

fun sigma f m n =

我没有进一步了解,因为我无法真正理解我被要求做什么。

【问题讨论】:

    标签: functional-programming sml smlnj currying


    【解决方案1】:

    实际上,柯里化函数并不是一个接受一个函数并产生另一个函数的函数。这是一个高阶函数。

    柯里化函数只是一个接受多个参数的函数,并且可以通过只给它一个参数来部分应用。

    例如,对于您的 sigma 问题,

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

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

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

    是一个柯里化函数,因为它需要三个参数,并且可以这样说

    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
    

    是同一函数的柯里化版本。这可以通过给它x来部分评估。例如,add 3 将计算为一个函数,该函数将向其参数添加三个。

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

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

    第二个等效于fn x => fn y => x + y,它接受一个 int 并计算为一个函数,该函数采用另一个 int 并计算为一个 int。

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

    希望这可以消除一些咖喱。

    【讨论】:

    • 我仍然不清楚如何将它应用于我的问题。我必须创建多个函数?
    • 是的,柯里化函数中的模式匹配可以用与非柯里化函数完全相同的方式完成。 (另外,请注意,它们被称为 curry 函数,而不是 curry 函数)。
    • @qaphla 如何为您的示例明确指定类型fun add x y。例如,我希望xy 是真实的,并且在函数中我在求和之前将它们四舍五入,add 函数返回一个 int。
    • 您好,您可以通过将函数的结果指定为实数来做到这一点 例如:add x y : real = x + y;
    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2021-03-23
    • 2014-03-19
    • 2014-02-23
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多