Para las siguientes definiciones de las funciones triviales:¿Cuál es la diferencia entre estas dos definiciones de tipo de función?
printLength1::(Num a)=>String->a
printLength1 s = length s
printLength2::String->Int
printLength2 s = length s
Por qué no son lo mismo? ¿En qué situaciones debo elegir una sobre la otra?
y me sale este error para printLength1:
Couldn't match type `a' with `Int'
`a' is a rigid type variable bound by
the type signature for rpnc :: String -> a at test.hs:20:1
In the return type of a call of `length'
In the expression: length s
In an equation for `rpnc': rpnc s = length s
entiendo este error. ¿Pero cómo puedo solucionar esto? Ya he leído algunas publicaciones aquí sobre la variable de tipo rígida, pero todavía no podía entender cómo solucionarlo.
Gracias chicos. Espero que no haya más caprichos ocultos en el lenguaje. – osager
@osager Esto no es un capricho, esta es una parte muy importante del sistema de tipos. Los tipos polimórficos (al menos los tipos polimórficos de rango 1) se convierten en tipos concretos según cómo se usan. Si escribe una firma de tipo que afirme que un tipo es polimórfico, debe ser realmente * be * polimórfico. – Carl
La clase 'Num' no es una rareza, pero se podría argumentar razonablemente que' length' es un 'Int' en lugar de' Num a' es una peculiaridad. –