学习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
.没有这个限制,数字的类型只受类型类的约束,理论上它可以是无限多种类型.
归档时间: |
|
查看次数: |
215 次 |
最近记录: |