gpt4 book ai didi

javascript - 对于流类型,是否可以自动推断将另一个函数作为参数的函数的返回值?

转载 作者:行者123 更新时间:2023-11-30 20:13:22 26 4
gpt4 key购买 nike

假设我有一个函数,它将一个函数作为参数并返回另一个函数,该函数将一个值传递给作为参数传递的函数:

const curry = f => x => f(x);

是否可以使用 Flow Type 来键入此函数,使得 curry 的返回值由传入的函数 f 确定(如果该函数已被调用)打字?

我试过这个:

const numToStr = (x: number): string => x.toString();
const curry = <F: Function>(f: F): (mixed => *) => (x: mixed): * => f(x);
const curried = curry(numToStr);

link

传递第一个参数的结果是生成的函数 curried 具有如下签名:

(((x: mixed) => any) | ((x: mixed) => empty))

这是有道理的,结果要么是空的,要么是任何东西。我希望的是,因为输入了 numToStr,所以 Flow 可以理解 curried 实际上是 number => string

有没有我错过的方法可以做到这一点?如果没有,任何人都可以解释为什么。

最佳答案

柯里化(Currying)通常适用于获取两个参数的函数并将其转换为一个参数的函数,该函数返回一个参数的另一个函数,该函数返回结果。

在 Flow 中它看起来像这样:

const curry = <A, B, C>(f: (A, B) => C): (A => (B => C)) => (x) => (y) => f(x, y);

const prefixNum = (prefix: string, x: number): string => prefix + x.toString();
const prefixed = curry(prefixNum);
const withHello = prefixed("hello ");
const result = withHello(3); // "hello 3"

您的版本有点不同。您正在将一个参数的函数转换为零参数的函数。这更像是惰性求值而不是柯里化(Currying):提供所有参数但只返回一个零参数函数(有时称为“thunk”),它在您调用时实际执行计算。实现可能如下所示:

const makeLazy = <A, C>(f: A => C): (A => (() => C)) => (x) => () => f(x);

本质上就是上面的定义,只是其中一种类型被替换成了()。这应该按您希望的方式工作:

const numToStr = (x: number): string => x.toString();
const lazyNumToStr = makeLazy(numToStr);
const thunk = lazyNumToStr(3);
thunk(); // "3"

关于javascript - 对于流类型,是否可以自动推断将另一个函数作为参数的函数的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52173384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com