已知Haskell非柯里化函数形式时如何编写对应柯里化版本的类型签名
问题解答
你写出的类型签名是错误的,核心问题有两处:
- 没有满足「柯里化版本」的要求,仍然是非柯里化函数的类型
Haskell中非柯里化的多参数函数通过元组传递所有参数,类型格式为(参数1类型, 参数2类型, ...) -> 返回值类型,和你写的格式完全一致。而柯里化的多参数函数会被拆解为「每次接收一个参数,返回接收下一个参数的函数」的嵌套结构,类型签名不需要用元组包裹参数,直接用->依次拼接各参数类型和最终返回值即可。 - 参数的类型顺序和题目给定的原始非柯里化函数约定不符
题目明确说明原始非柯里化函数的二元组参数类型为(x, y),第一个元素类型为x,第二个为y,而你写的参数类型是(y, x),顺序颠倒,不符合题目给定的前提约束。
正确实现示例
原始非柯里化版本的正确类型签名为:f :: (x, y) -> x
对应的柯里化版本的类型签名为:f :: x -> y -> x
这个类型的含义是:函数首先接收一个x类型的参数,返回一个类型为y -> x的函数,这个新函数接收一个y类型的参数后,最终返回x类型的值,和原始非柯里化版本的功能完全等价,Haskell标准库中的const函数就是该类型的典型实现。
内容的提问来源于stack exchange,提问作者Andrea Berger
相关产品推荐
相关产品推荐

