[Práctico 1] [Ejercicio 4] arbitrary en instancia Arbitrary

[Práctico 1] [Ejercicio 4] arbitrary en instancia Arbitrary

de Julio Carlos Vera Serafino -
Número de respuestas: 2

Hola, cómo están?

A ver si pueden darme alguna indicación sobre esto.

La única forma con la que logré que compilara es poner 

arbitrary = arbitrary

Con esto compila, pero no para cuando hace el test, tengo que pararlo con control c.

Otro problema que tengo es que no parecen estar definidas las funciones liftM. Las defino yo usando como referencia lo visto en clase, pero no corren. El mensaje de error habla de ambigüedad. La ambigüedad surge también con Node, cosa que no me esperaba. Si me esperaba el problema con Empty. Como no tiene parámetro (es Empty nomás, no Empty a, por ejemplo), me confunde para definir la función liftM.

Acá va el mensaje de error (una parte, al menos).

T.hs:43:79:

    Could not deduce (Arbitrary a2) arising from a use of ‘arbitrary’

    from the context (Arbitrary a)

      bound by the instance declaration at T.hs:39:10-42

    The type variable ‘a2’ is ambiguous

    Note: there are several potential instances:

      instance Arbitrary Test.QuickCheck.Random.QCGen

        -- Defined in ‘Test.QuickCheck.Arbitrary’

      instance Arbitrary a => Arbitrary (Control.Applicative.Const a b)

        -- Defined in ‘Test.QuickCheck.Arbitrary’

      instance Arbitrary (a b c) =>

               Arbitrary (Control.Applicative.WrappedArrow a b c)

        -- Defined in ‘Test.QuickCheck.Arbitrary’

      ...plus 81 others

    In the fourth argument of ‘liftM3’, namely ‘arbitrary’

    In the expression: liftM3 Node arbitrary arbitrary arbitrary

    In the expression: (2, liftM3 Node arbitrary arbitrary arbitrary)

Hice muchas pruebas diferentes, por distintos caminos. Una que se me ocurre es definir una función que cree árboles de cierto tamaño (:: Int->Tree). Pero eso no sería un generador, no sería de tipo Gen.

No es muy clara la pregunta, son muchos temas juntos. Si pudiera consultar personalmente o por zoom podría explicarme mejor.

Gracias por su ayuda,

Julio

En respuesta a Julio Carlos Vera Serafino

Re: [Práctico 1] [Ejercicio 4] arbitrary en instancia Arbitrary

de Marcos Viera - InCo -

Hola,

La definición:

arbitrary = arbitrary

te genera una recursión infinita.

La función liftM la podés importar de Control.Monad. Hay un buscador que es muy útil para encontrar funciones definidas en las bibliotecas, en el cuál además podés buscar por el tipo de la función. Es: https://hoogle.haskell.org/

Sin ver el código se me dificulta entender el error, si lo seguís teniendo me podés mandar el código por mensaje y lo vemos. Para hacer la instancia de Arbitrary del árbol te podés inspirar en las instancias vistas en las slides.