【发布时间】:2020-05-06 09:05:14
【问题描述】:
我有以下通用函数,我可以从中派生出各种有用的可变参数函数:
const variadic = f => {
const go = args =>
Object.defineProperty(
arg => go(args.concat([arg])),
"runVariadic",
{get: function() {return f(args)}, enumerable: true});
return go([]);
};
const arrFold = alg => zero => xs =>
xs.reduce((acc, x) => alg(acc) (x), zero);
const comp = f => g => x => f(g(x));
const id = x => x;
const varComp = variadic(arrFold(comp) (id));
const inc = x => x + 1;
const main = varComp(inc) (inc) (inc) (inc) (inc);
console.log(
main.runVariadic(0)); // 5
这种递归可变参数接口使我能够在不依赖方法链的情况下保持扁平的应用程序语法。此外,我可以部分应用和组合这些功能。不幸的是variadic 和派生的varComp 有无限类型。我隐约记得在 Haskell 中有一种方法可以键入此类函数,但它需要大量类型机器,namley 高级语言扩展。在 Typescript 中输入它们有什么技巧吗?
我是 Typescript 新手,所以我什至不知道从哪里开始。
【问题讨论】:
-
不,你不能在 TypeScript 中输入这个。为此,您需要依赖类型或类型类,TypeScript 都不支持。顺便说一句,你为什么还要写这样的代码?方法链有什么问题?
-
@AaditMShah 因为它最类似于 Haskell 和 Koltin 的中缀表示法。如果您知道一种替代方法,可以避免函数嵌套,而不会失去部分应用、组合和惰性的能力,并且具有适当的类型,请回复,我将排除它。
标签: javascript typescript types functional-programming variadic