a == 5
Num a => a
,并且由于Num
类并未定义
(==)
函数,因此我期望类型误差。有人可以解释为什么这有效吗?
ghci
将临时尝试将类型分配给
a
a = 3 :: Num a => a
您实际上写了类似的东西:
a = fromInteger 3
因此,可以专门针对Integer
,
Double
等。
在a == 5
的背景下,它要求a
必须为
(Num a, Eq a) => a
。它将执行dype默认设备,因此在情况下使用
Integer
。因此,它检查了:
fromInteger 3 == fromInteger 5
专业两者至Integer
,然后在这些方面运行(==)
函数。 Haskell中的型与Java中的内容有点“相反”。如果在Java中,您可以写:
MyInterfacefoo;这意味着我们只知道
foo
是一个实例。
如果我们写的话,请在Haskell中进行:
MyInterface
意味着
x :: Num a => a
是一种类型x
a
Num a
。如果我们以后在其他上下文中使用
x
,则可能需要额外的类型约束。如果因此我们写一个函数:
eq5 :: (Num a, Eq a) => a -> Bool
eq5 x = x == 5
a
Num a
和
Eq a
满足的所有类型。