Я играл с FunctionalDependencies-Extension Haskell вместе с MultiParamTypeClasses. Я определил следующее:Неоднозначные переменные типа с функциональными зависимостями Haskell
class Add a b c | a b -> c where
(~+) :: a -> b -> c
(~-) :: a -> b -> c
neg :: a -> a
zero :: a
, который работает отлично (я пробовал с экземплярами для Int и двойной с конечной целью, чтобы быть в состоянии добавить Int и парный без явного преобразования).
Когда я пытаюсь определить реализацию по умолчанию для нег или (~ -) как так:
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
Я думаю a
, b
и c
здесь не в abc образуют окружающий класс, но любые ab и c, так как я могу выразить тип, который является ссылкой на переменные локального типа?