【问题标题】:Generic curry function with n-arguments in typescript打字稿中带有 n 参数的通用咖喱函数
【发布时间】:2017-01-18 19:46:41
【问题描述】:

我可以为具有一定数量参数的函数创建一个通用的柯里化函数。即)

function curry2<T1,T2,R>(func:(arg1:T1, arg2:T2) => R, param2: T2):(arg:T1) => R{
    return (param1:T1) => func(param1, param2);
};

但是,我找不到一种(类型安全的)方法来为具有 任何 个参数的函数实现通用 curry 函数。在另一种语言中,我会将所有的柯里化函数(即:curry1、curry2、curry3 等)命名为相同的东西(curry),然后让函数重载来运行正确的 curry 实现。但是,打字稿不允许像这样的函数重载。

到处都写 curry2/curry1/curry3 而不是一个统一的 curry 接口并不是太麻烦,但如果有办法做到这一点,我会很感激知道如何做!

【问题讨论】:

  • 窝。这是我的想法,但无论如何谢谢。
  • 这不是 JavaScript。 JavaScript 和重载没有问题,因为 JavaScript 没有重载。 javascript 标签在这里不合适。
  • @Ryan 您提供的第二个链接是关于可变参数泛型的,这是另一回事。第一个是关于输入与bindapply 相关的内容,但这在这里也没有直接关系。
  • 你想在第二个参数中“咖喱”?不是“currying”的AFAIK。对于三个或更多参数的情况,您是否尝试部分应用最后一个参数?

标签: typescript generics functional-programming currying


【解决方案1】:

到处都写curry2/curry1/curry3而不是curry的单一统一接口也不是太麻烦,

你可以重载(doc https://basarat.gitbooks.io/typescript/content/docs/types/functions.html

更多

让你开始的东西:

function curry<T1,T2,R>(func:(arg1:T1, arg2:T2) => R, param2: T2):(arg:T1) => R;
function curry<T1,T2,T3,R>(func:(arg1:T1, arg2:T2, arg3: T3) => R, param2: T2):(arg:T1) => R;
function curry(){
    // Implement
    return undefined;
};

【讨论】:

  • 这不是真的。错误 TS2393:重复的功能实现。错误 TS2393:重复的功能实现。编辑:我想我说得太快了。看来您可以声明没有主体的函数。这有点酷。
【解决方案2】:

basarat 的例子很好,但第二个重载似乎不正确。 这是我在为 curry 函数编写类型签名时想到的:

interface curry {
    <T1, T2, R>(func: (p1: T1, p2: T2) => R): (p: T1) => (p: T2) => R;
    <T1, T2, T3, R>(func: (p1: T1, p2: T2, p3: T3) => R): (p: T1) => (p: T2) => (p: T3) => R;
    <T1, T2, T3, T4, R>(func: (p1: T1, p2: T2, p3: T3, p4: T4) => R): (p: T1) => (p: T2) => (p: T3) => (p: T4) => R;
    <T1, T2, T3, T4, T5, R>(func: (p1: T1, p2: T2, p3: T3, p4: T4, p5: T5) => R): (p: T1) => (p: T2) => (p: T3) => (p: T4) => (p: T5) => R;
}

当然你可以用更多的参数重复它,直到你达到一个安全的深度:)

// the actual curry function implementation ommited
var makeCurry: curry = <any> null;

// example function that we would like to curry, with two parameters
var getInfo = (age: number, name: string) => {
    return `${name} is ${age} years old`;
}

// the previous function curried
var getInfoCurried = makeCurry<number, string, string>(getInfo);

var info = getInfoCurried(26)('Gergo');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多