双人的类型

时间:2014-05-29 21:02:44

标签: haskell

ghci中学习Haskell:

Prelude Data.Ratio> :type 0.15
0.15 :: Fractional a => a

Prelude Data.Ratio> 0.15
0.15
it :: Double

为什么类型不同?那两个0.15的实例实际上是不同的类型吗?

1 个答案:

答案 0 :(得分:11)

这是由于dreaded monomorphism restriction。基本上,GHCi喜欢在执行时选择默认类型(默认Fractional类型为Double),但是当您使用:type询问类型时,它会选择最常用的版本。您可以使用NoMonomorphismRestriction扩展程序禁用此行为:

> :set -XNoMonomorphismRestriction
> :set +t
> 0.15
0.15
it :: Fractional a => a
> :t 0.15
0.15 :: Fractional a => a

虽然这个扩展名有一个更可怕的名字,但是当你分解它时它很简单:

Mono  -> One
Morph -> shape (type)
ism   -> thingy
Monomorphism -> one shape thingy -> one type thingy -> thing with a single type

所以基本上这是一个很长的词,意思是“单一类型”。然后使用“限制”,您会得到单态限制将事物限制为单一类型。在这种情况下,它将数字(事物)限制为类型Double。没有这个限制,数字的类型只受类型类的约束,理论上它可以是无限多种类型。