haskell - 类型之谜。为什么这段代码可以编译?

标签 haskell

此代码无法编译:

default ()

f :: RealFloat a => a
f = 1.0

g :: RealFloat a => a
g = 1.0

h :: Bool
h = f < g --Error. Ambiguous.

这是预期的,因为它不明确。两种可能性是 FloatDouble并且编译器不知道哪个 <来挑选。

但是,这段代码确实可以编译:

default ()

f :: RealFloat a => a
f = 1.0

g :: RealFloat a => a
g = 1.0

h :: RealFloat a => a
h = f + g --Why does this compile?
为什么?为什么 Haskell 这里没有像上面的例子一样感到困惑,关于 +选择(对于 FloatDouble )?

最佳答案

在第二个示例中 h 具有多态类型。因此,使用 + 的类型是明确的;只是还没有选择而已。

使用h的上下文将决定选择哪种类型的+(不同的使用站点可以做出不同的选择)。 h 的用户可以要求它提供任何他们想要的 RealFloat 类型; fg 还可以提供任何 RealFloat 类型,因此 h 只会要求它们的用户提供确切的类型正在要求。

关于haskell - 类型之谜。为什么这段代码可以编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34776282/

相关文章:

haskell - 为什么在 Haskell 中 0^0 == 1?

haskell - 多个数据构造函数的 Monad 实例

haskell - 如何使用 Stack 升级 GHC

haskell - 在 Haskell 中显示未知类型的列表

python - 与 Python 相比,在 Haskell 中调用 c 函数

haskell - Haskell 中的 main 函数是否总是以 main = do 开头?

haskell - 我可以要求 GHC 在开发过程中为每个模块导入 Debug.Trace 吗?

haskell - 无法让类型签名适用于简单的递归函数

parsing - Haskell Parsec Parser for Encountering [...]

Haskell, Snap : Simple snaplet construction. 我们什么时候使用 snaplet,什么时候使用库?