online - haskell pdf
Num vs Integral (2)
Como dijo Daniel Fischer, solía funcionar, pero ahora no funciona porque Num
y Eq
se dividieron, por lo que Num a
ya no implica Eq a
. Para arreglar su código, haga que la Eq a
explícita:
hola :: (Num a, Eq a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
Esta función:
hola :: (Integral a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
funciona bien. Pero este:
hola :: (Num a) => a -> String
hola 1 = "OK"
hola _ = "asdf"
no se puede compilar: "No se pudo deducir (Eq a) que surge del literal ''1''"
Realmente no lo entiendo. Estoy leyendo un tutorial donde se dice.
"Integral también es una clase de tipo numérica. Num incluye todos los números, incluidos números reales y números enteros, Integral incluye solo números enteros. En esta clase de tipo son Int y Integer". http://learnyouahaskell.com/types-and-typeclasses
¿Por qué no puedo usar Num?
Es un cambio reciente propuesto y aceptado en septiembre / octubre del año pasado , en la última versión del paquete base, Eq
y Show
ya no son superclases de Num
. Desde ese cambio, no se ha publicado una nueva versión del informe de idioma, por lo que aún no está en el informe. Y como es reciente, tampoco lo ha hecho todavía en muchos tutoriales o libros.
La "coincidencia de patrones" con un literal numérico es una aplicación implícita de (==)
, por lo que se requiere una instancia de Eq
para que funcione. Esa instancia ya no se puede deducir de la restricción Num
, por lo que el compilador (bastante nuevo: D) rechaza el código con solo una restricción Num
.
Pero Integral
es una subclase de Real
, que tiene Ord
(y por lo tanto Eq
) como una superclase, por lo tanto, eso funciona.