【问题标题】:Unable to inject parameters properly?无法正确注入参数?
【发布时间】:2021-11-20 02:23:45
【问题描述】:

const curryByBind = (fn) => fn.length === 0 ? fn() : (arg) => fn.bind(null, arg);
const sum = (x,y) => x+y;
const sumMany = curryByBind(sum);

console.log(sumMany(1)(2)())

我正在尝试学习curry 并尝试通过bind 将参数注入函数,我在想sumMany(1) 应该返回一个可以采用(2) 的函数,它最终最终执行fn(),但是我不知道哪个部分出了问题,它说的是sumMany(...)(...) is not a function

【问题讨论】:

    标签: javascript functional-programming bind


    【解决方案1】:

    您的curryByBind 工作正常:唯一的问题是您的参数用完了。

    sum(x, y) 接受两个参数。在使用一个参数(sumx)调用 sumMany 后,它返回一个需要单个参数的函数(sumy)。

    使用一个参数调用 that 函数后,您已经为 sum 的所有参数提供了值,因此它返回 3。(这不是一个函数,因此当您尝试调用它。)

    console.log(sumMany(1)(2)) 记录 3,符合预期。

    【讨论】:

    • hmm...那这不是我的意图..sumMany 应该能够接受任何随机数量的参数,最后当没有参数时,执行它,想知道你是否有任何想法关于那个?
    • usual definition 的每个调用都带有一个参数:最后不需要额外的零参数调用。但是,如果您想在最后使用零参数调用延迟执行,您可以添加另一个层,例如:const deferredCurry = (fn) => fn.length === 0 ? fn() : (arg) => ((...more) => () => fn(arg, ...more)) 然后,使用const sumMany = deferredCurry((x, y) => x + y)sumMany(1)(2)() 将按您的预期工作。
    • 关于curryByBind 的另一点:它只包含第一个参数。如果您想要一个适用于任意数量参数的版本(以便sum 的四参数版本可以像sumMany(1)(2)(3)(4) 一样工作),您将需要一些能够递归 curries 的东西。有一个很好的例子来说明如何做到这一点here,但你可能想先自己尝试一下。
    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 2020-03-30
    • 2014-06-11
    • 2015-10-06
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多