10Pines/pdepreludat

Pregunta: ¿Por qué se difieren algunos chequeo de tipos?

Opened this issue · 5 comments

(No sé si es bug o feature)
Esto en GHC pelado tira error en tiempo de compilación:

Prelude> data Cangrejo = Cangrejo {funcion:: Char -> Char} deriving Eq

<interactive>:10:58: error:
     No instance for (Eq (Char -> Char))
        arising from the first field of Cangrejo (type Char -> Char)
        (maybe you haven't applied a function to enough arguments?)
      Possible fix:
        use a standalone 'deriving instance' declaration,
          so you can specify the instance context yourself
     When deriving the instance for (Eq Cangrejo)

Pero en PdePreludat recién lo tira en tiempo de ejecución:

*Spec Library Spec> data Cangrejo = Cangrejo {funcion:: Char -> Char} deriving Eq
-- ¡¡¡No tiró error!!!
*Spec Library Spec> Cangrejo id == Cangrejo id

<interactive>:2:1: error:
     Las funciones no se pueden ordenar ni comparar.
     In the expression: Cangrejo id == Cangrejo id
      In an equation for it’: it = Cangrejo id == Cangrejo id

¿Quizás tiene que ver con el Instance TypeError que hacen acá?

Sí, seguramente es por eso! :(, o sea, hay una instancia de Ord y Eq para las funciones, solo que levanta un error de tipos la instancia.

Pregunta, si tratas de definir una función que compare dos cangrejos te deja o te tira un error de compilación?

Esto anda:

image

Y esto también:
image

Pregunta: ¿Qué es el operador =>?

Hay un operador =>? 🤔 , donde aparece?

Y ahh, igual lo que decia era:
-hacer el deriving de Eq
-escribir una función asi:

cangrejosamenteIguales :: Cangrejo -> Cangrejo -> Bool
cangrejosamenteIguales unCangrejo otroCangrejo = unCangrejo == otroCangrejo 

Eso falla en compilación o ejecución?

ludat commented

pregunta: no sera un tema de ghci? (se que ghci hace cosas medio raras con las instancias y algunos bindings).

Lo probaste tirandolo a un archivo y compilando el archivo?