He estado metiéndome en lo esencial del sistema de tipos haskell y tratando de llegar a los puntos finos de las clases tipográficas. Aprendí un montón, pero estoy golpeando una pared en los siguientes pedazos de código.Haskell tipo matices del sistema
El uso de estas definiciones de clase e instancia:
class Show a => C a where
f :: Int -> a
instance C Integer where
f x = 1
instance C Char where
f x = if x < 10 then 'c' else 'd'
Por qué es que este tipo pasa el corrector:
pero esto no lo hace?
g :: C a => a -> Int -> String
g x y = show(f y)
me parece la segunda alternativa mucho más fácil de leer, y parece ser sólo una pequeña diferencia (tenga en cuenta las firmas de tipos). Sin embargo, tratando de pasar eso, los resultados de typechecker en:
*Main> :l typetests.hs
[1 of 1] Compiling Main (typetests.hs, interpreted)
typetests.hs:11:14:
Ambiguous type variable `a0' in the constraints:
(C a0) arising from a use of `f' at typetests.hs:11:14
(Show a0) arising from a use of `show' at typetests.hs:11:9-12
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `show', namely `(f y)'
In the expression: show (f y)
In an equation for `g': g x y = show (f y)
Failed, modules loaded: none.
Y no entiendo por qué.
Nota: No pregunte "¿Qué está intentando hacer?" Espero que sea obvio que estoy metiéndome en un contexto abstracto para sondear el funcionamiento de este lenguaje. No tengo otro objetivo en mente que aprender algo nuevo.
Gracias
Bloody hell! Primera publicación en SO y obtengo tres respuestas excelentes y perspicaces en menos de 24 horas. Este lugar es increíble. Gracias chicos – TheIronKnuckle