Comencé a experimentar con Haskell y tengo un problema. qqq es una función que debería imprimir una cadena si se llama con "Nothing" e imprimir otras cosas si se llama con "Just something".Usando Haskell "Quizás", escriba declaraciones [pregunta del principiante]
El primer intento parece de trabajo:
qqq Nothing = print "There isn't anything to be printed."
qqq (Just x) = print "There is something to be printed." >> print x
main :: IO()
main = qqq (Just 43)
Pero:
- cuando trato de hacer
main = qqq (Nothing)
se produce un error ("tipo ambiguo variables` a0' en la restricción: (Mostrar a0) gracias a la utilización de 'qqq' ") - Cuando quiero añadir tipo de firma si falla:
-
qqq :: Maybe x => x -> IO()
->Type constructor 'Maybe' used as a class
-> ¿Pero no es así?
-
qqq :: (Maybe x) -> IO()
. Ahora la firma en sí parece tener éxito. Peromain = qqq (Just 43)
comienza a fallar con ese error misterioso(Show a0)
como en el casomain = qqq (Nothing)
.
Preguntas:
- Por qué llamar qqq con
Nothing
es tan diferente a la que llama conJust 43
? - ¿Qué es
(Show a0)
? Se menciona solo en los mensajes de error. Cualquier intento de usarlo conduce a algo así como "Mostrar no en el alcance". - ¿Cuál es la firma de tipo de letra correcta para esto? ¿Cómo se deduce la firma del tipo de impresión Haskell? Esperando algo como:
f 0 = 2
f x = (f (x-1)) + 3
main = print get_type_as_string(f)
-- prints "Number -> Number"
También respondió la pregunta no hecha "Por qué no puedo establecer nada en ghci, se queja' parse error on '=' '" –
Es "ambiguo tipo" siempre falla en Haskell o puede decidir "el tipo importa aquí, así que deje que sea ambiguo "a veces" –
Haskell se queja de tipos ambiguos cuando el compilador no sabe qué hacer. Entonces, si el compilador puede averiguar cuál será el tipo, no hay problema, pero si el tipo debe inferirse sin suficiente información, se obtiene el error. – Antti