Buenas, no se como definir Enumerate para pares.
Lo que intente fue lo siguiente:
instance (Enumerate a, Enumerate b) => Enumerate (a, b) where
enum n = [(x, y) | x <- (enum n :: [a]), y <- (enum n :: [b]), size x + size y <= n]
Pero el compilador da como error que no puede inferir los tipos de enum n :: [a] y enum n :: [b]
Por lo que lei, las variables de tipo a, b no se puede utilizar fuera del scope de instance .... => .... where, aunque existe una extension de Haskell Scoped Type Variables (https://wiki.haskell.org/Scoped_type_variables) que me permitiria referirme a a y b dentro de la definicion de la funcion.
El compilador sugiere una solucion utilizando forall, pero no termino de entender que es lo que hace, ni termino de ver porque solucionaria mi problema.
Es parte de la idea del ejercicio utilizar dicha extension?
Podria resolverlo de otra forma?
Porque no puedo referirme a variables de tipos dentro de la definicion de una funcion?
Dejo adjunto el error del compilador por si ayuda (otras soluciones que probe, tambien daban errores similares):
6.hs:41:30: error:
• Could not deduce (Enumerate a1) arising from a use of ‘enum’
from the context: (Enumerate a, Enumerate b)
bound by the instance declaration at 6.hs:40:10-55
Possible fix:
add (Enumerate a1) to the context of
an expression type signature:
forall a1. [a1]
• In the expression: (enum n :: [a])
In a stmt of a list comprehension: x <- (enum n :: [a])
In the expression:
[(x, y) |
x <- (enum n :: [a]), y <- (enum n :: [b]), size x + size y <= n]
|
41 | enum n = [(x, y) | x <- (enum n :: [a]), y <- (enum n :: [b]), size x + size y <= n]
| ^^^^^^
6.hs:41:52: error:
• Could not deduce (Enumerate b1) arising from a use of ‘enum’
from the context: (Enumerate a, Enumerate b)
bound by the instance declaration at 6.hs:40:10-55
Possible fix:
add (Enumerate b1) to the context of
an expression type signature:
forall b1. [b1]
• In the expression: (enum n :: [b])
In a stmt of a list comprehension: y <- (enum n :: [b])
In the expression:
[(x, y) |
x <- (enum n :: [a]), y <- (enum n :: [b]), size x + size y <= n]
enum n = [(x, y) | x <- (enum n :: [a]), y <- (enum n :: [b]), size x + size y <= n]
Saludos,
Rafael.