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?

questionAnswers(2)

yourAnswerToTheQuestion