首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能对一个只有一个参数的函数进行curry吗?

你能对一个只有一个参数的函数进行curry吗?
EN

Stack Overflow用户
提问于 2018-11-02 11:57:23
回答 2查看 212关注 0票数 2

这是计算矩形棱镜体积的一个例子。这简直就是教科书上的柯里酱。

代码语言:javascript
复制
function volume(l, w, h) {
    return l * w * h;
}

function curriedVolume(length) {
    return function(width) {
        return function(height) {
            return height * width * length;
        }
    }
}

volume(2, 3, 4); // 24
curriedVolume(2)(3)(4); // 24

下面是一个类似的例子,除了非curried函数接受一个参数,该参数是一个对象。

代码语言:javascript
复制
function volume(dimensions) {
    return dimensions.l * dimensions.w * dimensions.h;
}

function curriedVolume(dimension, finalDimensions={}) {
    Object.assign(finalDimensions, dimension);
    if (Object.keys(finalDimensions).length === 3) {
        return finalDimensions.l * finalDimensions.w * finalDimensions.h;
    }
    return function(dimension) {
        return curriedVolume(dimension, finalDimensions);
    }
}

volume({
    l: 2,
    w: 3,
    h: 4,
});
curriedVolume({ l: 2 })({ w: 3 })({ h: 4 }); // 24
curriedVolume({ w: 2, h: 3 })({ l: 4 }); // 24

这还被认为是“讨好”吗?它有效吗?

EN

回答 2

Stack Overflow用户

发布于 2018-11-03 10:45:27

我已经评论过这个问题在某种程度上是一个观点问题,但我有足够的兴趣提供我的观点,尽管我感觉有点淘气。我还没有提供一个明确的答案(因为我不确定是否存在),但我将通过调查断言,您的第二个示例并不像术语通常所表示的那样是纠缠的。

您的示例将部分应用这些参数,直到它关闭足够多的参数来计算结果,然后它将返回计算的体积。这没什么好争论的。

要声称它是currying的一个例子,你必须争辩说:

外部函数有三个参数,它们恰好隐藏在一个参数中,然后

  1. 每个返回的部分应用函数声明一个对象参数

这两个声明都必须是真的,您的示例才能符合currying的定义。

然而,现在你遇到了一个矛盾。通过1)对象实参不是“真正的”单数实参。但是在2)中,你必须直接反驳1),以便声明返回的函数是只有一个参数的函数。所以这是不一致的。

抛开语义不谈,将单个对象作为参数传递会改变curried函数的调用机制,以便您可以使用包含所有三个伪参数(对象属性)的对象来调用它,如果您碰巧有这三个伪参数(对象属性)的话,在这种情况下,您将不会得到函数值返回-相反,您将立即获得计算出的体积。这使得该函数不是平凡的可重入的。假设您正在将某个数据流的结果对象传递给此函数。现在,您的函数在完全相同的代码行中的行为会有所不同,这取决于您提供给它的对象的状态。同样有争议的是,当涉及到currying时,这并不符合“法律精神”,因为您已经向函数引入了副作用,这使得很难对代码的行为进行推理。

最后,可能也是最重要的一点是,通过编写一个将对象作为参数接收的函数,您已经擦除了函数的类型签名,以便在不读取内部代码本身的情况下不能从中推断出任何东西。这将使得它不可能在元编程方法中使用,因为它将共享与期望具有两个、四个或十个属性的对象的函数相同的类型签名。

票数 1
EN

Stack Overflow用户

发布于 2018-11-02 12:14:03

是的,在函数中使用对象仍然是错误的。

请参阅this quote

以Haskell Brooks Curry命名,currying是将一个函数分解为一系列函数的过程,每个函数都有一个参数……

来自here

Currying是一种将具有多个参数的函数求值为具有单个参数的函数序列的技术。

所以只要你的函数中没有两个参数,那么是的,它仍然被认为是"currying“。

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

https://stackoverflow.com/questions/53112505

复制
相关文章

相似问题

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