Pregunta: ¿Por qué se difieren algunos chequeo de tipos?
Opened this issue · 5 comments
asanzo commented
(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
JuanFdS commented
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?
asanzo commented
JuanFdS commented
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?