gpt4 book ai didi

javascript - 函数式 JavaScript : What is the Hindley-Milner Type Signature of Compose?

转载 作者:行者123 更新时间:2023-11-30 07:53:31 25 4
gpt4 key购买 nike

以下对 compose 函数的 Hindley-Milner 类型签名的尝试是否正确?

// compose :: (f -> [f]) -> (f -> f -> f) -> [f] -> f
const compose = (...fns) => fns.reduce((f,g) => (...args) => f(g(...args)));

最佳答案

不,那是不正确的。您的 compose 函数将一组函数作为输入,并生成一个(组合的)函数作为输出,因此签名显然是错误的。另一方面,我认为不可能使用 Hindley-Milner 类型系统编写该函数,除非您假设 fns 中的所有函数都是同一类型的一元函数: a -> a(即 endomorphisms 的数组)。

compose :: [a -> a] -> (a -> a)

JavaScript 是动态类型的,所以它实际上允许fns 中的每个函数是不同的类型(JS 不要求数组是同构的)。这意味着您可能需要发明一些新语法,以便表达您拥有的compose 类型。方法如下 Ramda (JS 的功能实用程序库)描述了 R.compose 的类型:

((y → z), (x → y), …, (o → p), ((a, b, …, n) → o)) → ((a, b, …, n) → z)

它使用此 ... 语法来表示可变参数函数。参数列表中最右边的函数是 ((a, b, …, n) → o) 类型,这意味着它是一个可变参数函数,返回一个 o。这个 o 然后被用作下一个类型为 (o → p) 的函数的输入。这继续沿着参数列表向下直到最左边的函数是 (y → z) 类型,其中 z 成为调用返回函数的结果类型:((a, b, …, n) → z)

关于javascript - 函数式 JavaScript : What is the Hindley-Milner Type Signature of Compose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46981800/

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