这个问题在这里已经有了答案:
8年前关闭。
为了尝试和练习一些 Haskell 并了解 point free 我正在玩一个函数来平方一个数字
所以我开始定义
>let dup f x = f x x
所以我可以根据 dup 重写 sq (现在不用担心让 dup 点免费)
>let sq x = dup (*) x
并检查 sq 的类型 我看到了我期望看到的
>:t sq
>sq :: Num t => t -> t
所以我删除了 x 并得到
>let sq = dup (*)
>:t sq
sq :: Integer -> Integer
我错过了什么?
最佳答案
您遇到了单态限制。 Haskell 不会推断函数的多态类型,除非它们以“函数”样式(不是无点)给出。这意味着 let sq = dup (*)
不会进行类型检查,但是 Haskell 对标准数字类有所谓的“默认规则”,这意味着它默认为单态类型“Integer->Integer”
Prelude> :set -XNoMonomorphismRestriction
Prelude> let dup f x = f x x
Prelude> let sq = dup (*)
Prelude> :t sq
sq :: Num t => t -> t
关于haskell - 为什么把sq改成point-free会改变类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15602500/