Utilizando "Quizás" de Haskell, escriba las declaraciones [pregunta del principiante]

Empecé 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".

El primer intento parece funcionar:

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 hacermain = qqq (Nothing) falla ("Variable de tipo ambiguo` a0 'en la restricción: (Mostrar a0) que surge del uso de' qqq '")Cuando quiero agregar la firma de tipo 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 esa misteriosa(Show a0) error como enmain = qqq (Nothing) case.

Preguntas:

Por qué llamar a qqq conNothing es muy diferente a llamar conJust 43?Que es(Show a0)? Solo se menciona en los mensajes de error. Cualquier intento de usarlo conduce a algo como "Mostrar no en el alcance". ¿Cuál es la firma de tipo correcta para esto? ¿Cómo hacer la firma del tipo de impresión Haskell que dedujo? Esperando algo como:
f 0 = 2
f x = (f (x-1)) + 3

main = print get_type_as_string(f)
-- prints "Number -> Number"

Respuestas a la pregunta(1)

Su respuesta a la pregunta