在ghci
中学习Haskell:
Prelude Data.Ratio> :type 0.15
0.15 :: Fractional a => a
Prelude Data.Ratio> 0.15
0.15
it :: Double
为什么类型不同?那两个0.15的实例实际上是不同的类型吗?
答案 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
。没有这个限制,数字的类型只受类型类的约束,理论上它可以是无限多种类型。