【问题标题】:Curried function in Typescript打字稿中的咖喱函数
【发布时间】:2019-03-29 14:54:51
【问题描述】:

我正在编写一个简单的打字稿程序,它接受两个参数,x 和 y,并将这些参数传递给 Math.pow(x,y)。

因为我想写一个使用 Math.pow() 的柯里化函数,所以我尝试了:

function power(x:number,y:number):number {
   return Math.pow(x,y);
}

但也有人写成:

function mathPow(x : number) : number => (number=>number) {

    (y : number) => Math.pow(x,y)
}

我想知道我上面的第一个尝试是否被认为是咖喱,因为这是我能想到的最简单的尝试。还是第二个是整体更好的咖喱版本?

--更新

function pow(x:number):number {
  return function(y:number) {
    return Math.pow(x,y);
  }
}

【问题讨论】:

  • 第一个没有柯里化,因为您在调用它时仍需要传递所有参数。柯里化的问题是你返回一个函数(需要更少的参数)。
  • @trincot 谢谢。我在更新的帖子中第二次重新尝试了柯里化语法。你能调查一下并告诉我我现在做得对吗?
  • 您的第二次尝试与“某些人”的尝试相同,但使用 function 关键字而不是箭头函数(表达式)语法。但是,您应该更改外部函数的返回类型。它不是number,而是一个函数。注意:StackOverflow 问题不应该是在讨论期间使用新尝试更新的剪贴板。请将您的问题修正为稳定的问题。
  • @trincot 谢谢!会记住这一点。干杯

标签: javascript typescript currying


【解决方案1】:

您可以使用此自定义 curry 函数将具有两个参数的任何函数转换为其“curry 版本”:

 function curry<T1, T2, T3>(fn: (a: T1, b: T2) => T3) {
      return (a: T1) => (b: T2) => fn(a, b);
 }

那你就可以这样调用了:

    const curriedPower = curry(power);
    const fistArgPowerCall= curriedPower(5);
    const powerCallResult = fistArgPowerCall(5);

您还可以将其扩展为处理 3 个参数:

function curry<T1, T2, T3, T4>(fn: (a: T1, b: T3, c: T2) => T4) {
     return (b: T3) => (c: T2) => (a: T1) => fn(a, b, c);
}

等等等等……

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多