双人的类型

Let*_*t4U 6 haskell

学习Haskell,在ghci:

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

Prelude Data.Ratio> 0.15
0.15
it :: Double
Run Code Online (Sandbox Code Playgroud)

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

bhe*_*ilr 11

这是由于可怕的单态性限制.基本上,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
Run Code Online (Sandbox Code Playgroud)

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

Mono  -> One
Morph -> shape (type)
ism   -> thingy
Monomorphism -> one shape thingy -> one type thingy -> thing with a single type
Run Code Online (Sandbox Code Playgroud)

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

  • 我注意到即使它显示`it :: Fractional a => a`,它显然需要选择*some*类型来评估和打印实际结果"0.15"(例如`0.15 :: Rational`的打印方式不同),所以即使使用'NoMonomorphismRestriction`也有*某些*默认和"双重". (6认同)