Powiedz, że mam następujący (błędny) kod.Haskell Błąd z niepoprawnym kodem?
data A a b where
APure :: (A a b)
AApply :: A (A b c) c
test :: (A a b) -> a -> b
test (APure) a = a
test AApply a = undefined
GHC wtedy dać mi ten błąd:
Couldn't match type `b' with `A b1 b'
`b' is a rigid type variable bound by
the type signature for test :: A a b -> a -> b
Inaccessible code in
a pattern with constructor
AApply :: forall c b. A (A b c) c,
in an equation for `test'
In the pattern: AApply
In an equation for `test': test AApply a = undefined
nie jest to komunikat o błędzie całkowicie błędne? Błąd nie ma nic wspólnego z AApply.
W jaki sposób "AApply" powinien mieć ogólny typ "A a b", jeśli zadeklarowałeś go jako "A (A b c) c"? To tak, jakbyś definiował 'concat ':: [a] -> [b]' jako 'concat' = concat': jak Haskell zamierza zunifikować' a' "down" do '[b]' ?. – leftaroundabout
Tak, to nieintuicyjne. Być może powinieneś [zgłosić błąd] (http://hackage.haskell.org/trac/ghc/newticket?type=bug). –
@leftaroundabout Nie rozumiem, co masz na myśli, ale ta sprawa jest poprawna. Czytaj na temat wzorcowania z GADT. – nulvinge