El propósito de esta parte del código en particular es hacer que la función size
sea más eficiente que simplemente contar todos los elementos en elems
. Me he decidido a sumar los dos tipos que componen la lista, pero parece que no puedo crear la firma de la función de tamaño.¿Cómo se puede comparar con el tipo "O bien una b"?
instance (Finite a, Finite b) => Finite (Either a b) where
elems = combineLists [Left x | x <- elems] [Right x | x <-elems]
size ??? = (size a) + (size b)
De Preludio, sabemos que Either a b = Left a | Right b
.
Lo primero que probé fue hacer coincidir Either
, pero por supuesto es un tipo, por lo que no funciona. A continuación, intenté ((Left a) | (Right b))
, pero tampoco voy a eso. Nada más parece coincidir con el tipo Either a b
.
que era capaz de conseguir size (Left a)
para compilar, pero desde que le falta el componente b
, recibo el error:
Ambiguous type variable `b' in the constraint:
`Finite b' arising from a use of `size' at <interactive>:1:0-12
que por supuesto tiene sentido en el contexto, pero realmente no tengo idea de cómo partido Either a b
.
¿Alguien tiene alguna idea?
Parece un poco confundido acerca de la diferencia entre un tipo y un constructor. "O bien un b" es un tipo con dos constructores, "Izquierda" y "Derecha". Los tipos van en firmas de tipo, mientras que los constructores entran en código. Esta es una confusión común porque muchos tipos usan el mismo nombre para el tipo y el constructor, como en "datos Foo = Foo Int String"; el primer "Foo" es el tipo, mientras que el segundo es el constructor. –