此代码无法编译:
default ()
f :: RealFloat a => a
f = 1.0
g :: RealFloat a => a
g = 1.0
h :: Bool
h = f < g --Error. Ambiguous.
这是预期的,因为它不明确。两种可能性是 Float
和Double
并且编译器不知道哪个 <
来挑选。
但是,这段代码确实可以编译:
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 这里没有像上面的例子一样感到困惑,关于 +
选择(对于 Float
或 Double
)?
最佳答案
在第二个示例中 h
也 具有多态类型。因此,使用 +
的类型是明确的;只是还没有选择而已。
使用h
的上下文将决定选择哪种类型的+
(不同的使用站点可以做出不同的选择)。 h
的用户可以要求它提供任何他们想要的 RealFloat
类型; f
和 g
还可以提供任何 RealFloat
类型,因此 h
只会要求它们的用户提供确切的类型正在要求。
关于haskell - 类型之谜。为什么这段代码可以编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34776282/