Niezrozumiały komunikat o błędzie z rodzinami typów
Staram się zrozumieć rodziny typu bez większego sukcesu. Oto minimalny przykład:
{-# LANGUAGE TypeFamilies #-}
class Object obj where
type Unit obj :: *
unit :: Unit obj
instance (Object obj, Object obj') => Object (obj, obj') where
type Unit (obj, obj') = (Unit obj, Unit obj')
unit = (unit, unit)
Myślę, że intencja jest dość przejrzysta (próbuję zdefiniować kategorię produktu).
To daje mi:
objs.hs:10:10:
Could not deduce (Unit obj' ~ Unit obj1)
from the context (Object obj, Object obj')
bound by the instance declaration at objs.hs:8:10-56
NB: `Unit' is a type function, and may not be injective
The type variable `obj1' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Expected type: Unit (obj, obj')
Actual type: (Unit obj0, Unit obj1)
In the expression: (unit, unit)
In an equation for `unit': unit = (unit, unit)
In the instance declaration for `Object (obj, obj')'
Próbowałem dodać podpisy typu:
unit = (unit :: Unit obj, unit :: Unit obj')
ale to tylko pogarsza sprawę.
Następująca modyfikacja się kompiluje:
{-# LANGUAGE TypeFamilies #-}
class Object obj where
type Unit obj :: *
unit :: obj -> Unit obj
instance (Object obj, Object obj') => Object (obj, obj') where
type Unit (obj, obj') = (Unit obj, Unit obj')
unit (o, o') = (unit o, unit o')
ale nie podoba mi się zbyteczny argument zaunit
.
Czy można zdefiniować bez argumentówunit
?