2

可能重复:
这个 ghci 会话中的类型是怎么回事?

为了尝试练习一些haskell并了解无点,我正在玩一个对数字求平方的函数

所以我开始定义

>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

我错过了什么?

4

1 回答 1

3

您遇到了单态性限制。Haskell 不会推断函数的多态类型,除非它们以“函数”样式(不是无点)给出。这意味着let sq = dup (*)不会进行类型检查,但 Haskell 对标准数值类有所谓的“默认规则”,这意味着它默认为单态类型“整数->整数”

Prelude> :set -XNoMonomorphismRestriction
Prelude> let dup f x = f x x
Prelude> let sq = dup (*)
Prelude> :t sq
sq :: Num t => t -> t
于 2012-07-04T23:20:04.570 回答