Ładuje bez błędu:Na deklaracji instancji funktora
data Const c a = Const c
instance Functor (Const c) where
fmap _ (Const v) = Const v
... ale to
data Const' c a = Const' c
instance Functor (Const' c) where
fmap _ cv = cv
... nie powiedzie się z:
Couldn't match type `a' with `b'
`a' is a rigid type variable bound by
the type signature for fmap :: (a -> b) -> Const' c a -> Const' c b
at test.hs:4:5
`b' is a rigid type variable bound by
the type signature for fmap :: (a -> b) -> Const' c a -> Const' c b
at test.hs:4:5
Expected type: Const' c b
Actual type: Const' c a
In the expression: cv
In an equation for `fmap': fmap _ cv = cv
In the instance declaration for `Functor (Const' c)'
nie rozumiem błąd. Dlaczego kompilator nie może wywnioskować, że typem cv
jest ? Cóż innego mogłoby być, biorąc pod uwagę resztę deklaracji i definicję fmap
?
Na szczęście startowanie konstruktora 'Const' i jego ponowne włączenie jest bezpłatne, ponieważ' Const' jest newtype. Sytuacja jest znacznie smutniejsza w przypadku "Albo", gdzie pamięć może wymagać przydzielenia, aby zmienić typ, nawet jeśli reprezentacja pozostaje taka sama. – dfeuer