Ejercicio 6.f Practico 4

Ejercicio 6.f Practico 4

de Rafael Agustin Castelli Ottati -
Número de respuestas: 2

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.

En respuesta a Rafael Agustin Castelli Ottati

Re: Ejercicio 6.f Practico 4

de Juan Pablo García Garland -
Hola Rafael.

Se puede (y debe) resolver todo sin la necesidad de usar extensiones a menos que se indicara lo contrario.

En este caso ¿para qué necesitás acceder a la variable de tipos? Fijate que los tipos se infieren del contexto, por lo que no es necesario anotarlos. Tu definición sin las anotaciones me compila bien :)
En respuesta a Juan Pablo García Garland

Re: Ejercicio 6.f Practico 4

de Rafael Agustin Castelli Ottati -
Hola, muchas gracias por la respuesta.
Pense que eran necesarias las anotaciones de tipo porque al correr enum n en el interprete las tenia que poner, pero ahora me quedo que se infieren del contexto (cosa que no pasa en el interprete).