假设我要(+)
在 Strings 上定义,但不是通过给出Num String
.
为什么 Haskell 现在隐藏了Num
s(+)
函数?毕竟我提供的功能:
(+) :: String -> String -> String
可以通过编译器与 Prelude 的(+)
. 为什么两个函数不能存在于同一个命名空间中,但具有不同的、不重叠的类型签名?
只要代码中没有调用函数,Haskell 就会关心是否存在歧义。然后使用参数调用函数将确定类型,以便可以选择适当的实现。
当然,一旦有实例Num String
,实际上就会发生冲突,因为此时 Haskell 无法根据参数类型决定选择哪个实现,如果函数被实际调用。
在这种情况下,应该引发错误。
这不会允许函数重载而没有陷阱/歧义吗?
注意:我不是在谈论动态绑定。