Давайте рассмотрим следующий пример:Неполного умозаключения неявного типа в Haskell
data A = A{x::Int} deriving(Show)
instance Func_f (A -> String) where
f _ = "ala"
class Func_f a where
f :: a
main :: IO()
main = do
let
a = A 5
x = f a
print 5
скомпилирован с ghc -XFlexibleInstances main.hs
(я пробовал -XExtendedDefaultRules
, но без какого-либо прогресса)
Почему во время компиляции мы получаем ошибка:
main.hs:25:21:
No instance for (Func_f (A -> t0)) arising from a use of `f'
The type variable `t0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there is a potential instance available:
instance Func_f (A -> String) -- Defined at main.hs:7:10
Possible fix: add an instance declaration for (Func_f (A -> t0))
In the expression: f a
In an equation for `x': x = f a
In the expression:
do { let a = A 5
x = f a;
print 5 }
Существует только один в позиция для Func_f, поэтому Haskell должен знать результат x = f a
. Вы можете исправить ошибку, указав тип вручную, например: x = f a :: String
, но это не подходит для моего случая, потому что я генерирую код Haskell, и мне бы хотелось, чтобы тип Haskell's inferencer выполнял эту работу для меня.
Хммм ... Только один экземпляр? Вы уверены, что вам нужен класс типа вообще? [Здесь] (http://lukepalmer.wordpress.com/2010/01/24/haskell-antipattern-existential-typeclass/) вы можете прочитать, как заменить класс типа структурой данных. (Вы не выполняете экзистенциальный антивирус, но разрешение там может работать.) – AndrewC
У меня было бы много экземпляров, но все они были бы одинаковыми. –