Mensaje de error incomprensible con familias de tipos
Estoy tratando de entender las familias tipográficas sin mucho éxito. Aquí hay un ejemplo mínimo:
{-# 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)
La intención es bastante transparente, creo (tratando de definir una categoría de producto).
Esto me da:
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')'
He intentado agregar firmas de tipo:
unit = (unit :: Unit obj, unit :: Unit obj')
Pero esto solo empeora las cosas.
La siguiente modificación compila:
{-# 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')
Pero no me gusta el argumento superfluo paraunit
.
¿Es posible definir el argumento menos?unit
?