Przepraszam, że zawracam sobie głowę tym prostym problemem. Próbuję dowiedzieć się, jak działa rozszerzenie rodziny typów. Kiedy się z tym głupio napotkałem błąd, nie mogłem zrozumieć dlaczego.Błąd rodziny typu Haskella
class Foo a b c where
data T a b c :: *
f :: a -> T a b c
g :: T a b c -> b
h :: c -> a -> b
h c a = g $ f a
Komunikat o błędzie:
Could not deduce (Foo a b c0) arising from a use of ‘g’
from the context (Foo a b c)
bound by the class declaration for ‘Foo’
at DB/Internal/Typecast.hs:(17,1)-(25,19)
The type variable ‘c0’ is ambiguous
Relevant bindings include
a :: a (bound at DB/Internal/Typecast.hs:25:9)
h :: c -> a -> b (bound at DB/Internal/Typecast.hs:25:5)
In the expression: g
In the expression: g $ f a
In an equation for ‘h’: h c a = g $ f a
ja nie rozumiem, jak to c niejednoznaczne w T a b c
dla g
. Czy kompilator nie może uzyskać typu c
z T a b c
z f
?
Chcę tylko kompozytu g . f
Proszę poprawić wcięcie w przykładowym kodzie - to znaczy zamieścić swój aktualny kod. Kod księgowania inny niż ten, którego używasz, po prostu zaciemnia rzeczywisty problem. – Cubic
"Czy kompilator nie może uzyskać typu' c' z 'T a b c'' f'? Tak, ale skąd 'f' otrzymuje jego' T a b c'? –
@DanielWagner Niestety nie sądzę, że rozumiem, jak działa rodzina typów. Czy T a b c zarówno w f i g, co deklaruję w deklaracji wystąpienia przy użyciu słowa kluczowego danych? – Larry