【发布时间】:2018-02-21 22:55:21
【问题描述】:
当我在 GHCi 中输入 :t 命令时,我看到了多态类型:
ghci> :t 42
42 :: Num t => t
ghci> :t div
div :: Integral a => a -> a -> a
但是在我实际评估这些函数之后,我看到了类型默认规则的结果。在根据 Haskell 报告和/或 ghc 实现应用类型默认规则后,是否有一些命令或能力可以在 ghci 中观察类型将如何更改?
【问题讨论】:
-
您如何看待类型默认规则的结果?
:t 42 `div` 2显示Integral a => a,let-bindings 等的结果也是如此。 -
@n.m.我说的是实际结果。就像
2^100 `div` 2打印633825300114114700748351602688因为这种情况下的默认类型是Integer。即使ghci说这个常量的类型是多态的,实际上它是特定的,我想看看使用的是哪种单态类型。 -
@Shersh 不过这只是 GHCi。 REPL 选择一个类型(在本例中为
Integer),因为它必须显示一些东西。在“真实”代码中,它将是多态的,直到上下文选择一种类型。 -
@BenjaminHodgson 在实际代码中,我可以编写
main = print (2 ^ 100),它会选择Integer类型,尽管会发出警告说我是个坏人。发生这种情况是因为应用了类型默认规则。我想看看ghci或ghc会选择哪个特定类型。我不在乎它如何选择默认类型,我只想看看选择了什么类型。
标签: haskell types polymorphism ghci monomorphism-restriction