MultiParamTypeClassesと一緒にFunctionalDependencies-ExtensionofHaskellで遊んでいました。私は次のように定義しました。
class Add a b c | a b -> c where
(~+) :: a -> b -> c
(~-) :: a -> b -> c
neg :: a -> a
zero :: a
これは正常に機能します(明示的な変換なしでIntとDoubleを追加できるようにするという最終的な目標を持って、IntとDoubleのインスタンスを試しました)。
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
では、まったく同じインスタンスからゼロにするように指定するにはどうすればよいですか。つまり、次のように表現するにはどうすればよいでしょうか。
neg n = (zero :: Add a b c) ~- n
とは、周囲のクラスのabcではなく、abとcであると思います。a
では、ローカル型変数への参照である型をどのように表現できますか?b
c