haskell - double 类型

标签 haskell

学习 Haskell,在 ghci :

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

Prelude Data.Ratio> 0.15
0.15
it :: Double

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

最佳答案

这是由于 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 类型。 .没有这个限制,数字的类型只受类型类的约束,理论上它可以是无限多的类型。

关于haskell - double 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23942957/

相关文章:

haskell - 如何使用 Text.Pandoc (Haskell) 将 Markdown 转换为 Html?

haskell - 在 Haskell 中获取列表的所有排列

haskell ::. 是什么意思?

haskell - 整数 float

haskell - "f (a -> b)"类型签名在 Haskell 中是什么意思?

python - 转换以前缀表示法给出的表达式,识别公共(public)子表达式和依赖项

haskell - 这段混淆的 Haskell 代码是如何工作的?

haskell - 观察类型理论中的模式匹配

algorithm - 确定给定数字是否是haskell中的素数

haskell - 为数据构造函数提供列表中的元素