我在玩 Haskell 的 FunctionalDependencies-Extension 以及 MultiParamTypeClasses。我定义了以下内容:
class Add a b c | a b -> c where
(~+) :: a -> b -> c
(~-) :: a -> b -> c
neg :: a -> a
zero :: a
效果很好(我尝试过使用 Int 和 Double 的实例,最终目标是能够在不显式转换的情况下添加 Int 和 Doubles)。
当我尝试为 neg 或 (~-) 定义默认实现时,如下所示:
class Add ...
...
neg n = zero ~- n
GHCi (7.0.4) 告诉我以下内容:
Ambiguous type variables `a0', `b0', `c0' in the constraint:
(Add a0 b0 c0) arising from a use of `zero'
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `(~-)', namely `zero'
In the expression: zero ~- n
In an equation for `neg': neg n = zero ~- n
Ambiguous type variable `a0' in the constraint:
(Add a0 a a) arising from a use of `~-'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: zero ~- n
In an equation for `neg': neg n = zero ~- n
我想我确实理解这里的问题。GHC 不知道要使用哪个零,因为它可以是任何零,产生任何东西,而这些东西又被输入到~-
我们只知道的 a 中,它有一个a
正确的论点并产生一个a
.
那么我如何指定它应该是来自同一个实例的零,即我如何表达如下内容:
neg n = (zero :: Add a b c) ~- n
我认为a
,b
和c
here不是周围类的 abc ,而是任何 ab 和 c ,那么我该如何表达一个对局部类型变量的引用的类型呢?