21

我正在学习 Haskell,当我遇到一些非常令人费解的事情时,我正在玩 ghci。

首先,创建一个简单的添加函数:

Prelude> let add x y = x + y

请注意,它适用于整数和浮点数:

Prelude> add 3 4
7
Prelude> add 2.5 1.3
3.8

现在创建一个应用函数。它与$(但不是中缀)相同。它就像一个无操作添加:

Prelude> let apply f x = f x
Prelude> apply add 3 4
7
Prelude> apply add 2.5 1.3
3.8

好的,现在 make与使用add'相同add'但使用apply

Prelude> let add' = apply add
Prelude> add' 3 4
7
Prelude> add' 2.5 1.3

<interactive>:1:9:
    No instance for (Fractional Integer)
      arising from the literal `1.3' at <interactive>:1:9-11
    Possible fix: add an instance declaration for (Fractional Integer)
    In the second argument of `add'', namely `1.3'
    In the expression: add' 2.5 1.3
    In the definition of `it': it = add' 2.5 1.3

笏。

以下是类型:

Prelude> :t add
add :: (Num a) => a -> a -> a
Prelude> :t apply add
apply add :: (Num t) => t -> t -> t
Prelude> :t add'
add' :: Integer -> Integer -> Integer
Prelude> 

为什么 与add'有不同的类型apply add

这是 ghci 的奇怪之处,还是一般来说在 Haskell 中是这样的?(我怎么能分辨出区别?)

4

1 回答 1

18

这是单态性限制。当您使用简单的模式绑定(仅名称,没有任何函数参数)并且没有类型签名定义值时,它会获得单态类型。尝试根据默认规则消除任何类型变量的歧义,如果不成功,则会出现类型错误。

在这种情况下,受Num约束的类型变量默认为Integer.

您可以关闭单态限制

ghci> :set -XNoMonomorphismRestriction

-XnoMonomorphismRestriction在命令行上使用标志。

于 2012-06-12T19:34:20.187 回答