打字稿中的咖喱函数

时间:2018-11-03 11:08:51

标签: javascript typescript currying

我正在编写一个简单的打字稿程序,该程序带有两个参数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);
  }
}

1 个答案:

答案 0 :(得分:0)

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

public class Test {
    public static void main(String[] args) {
        List<GenericClass<String>> list = new ArrayList<>();
        for (GenericClass genericClass : list) {
            for (Integer integer : genericClass.getList()) {
                System.out.println(integer);
            }
        }
    }

    private class GenericClass<T extends String> {
        private List<Integer> list = new ArrayList<>();

        private List<Integer> getList() {
            return list;
        }
    }
}

然后您可以用这种方式调用它:

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

您还可以扩展它以处理3个参数:

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

依此类推...