sando o "Talvez" de Haskell, declarações de tipo [pergunta do iniciante]

Comecei a experimentar Haskell e tenho um problema. qqq é uma função que deve imprimir uma sequência de caracteres se chamada com "Nothing" e imprimir outras coisas se chamada com "Just something".

A primeira tentativa 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)

Mas

quando eu tento fazermain = qqq (Nothing) falha ("Variável do tipo ambígua` a0 'na restrição: (Mostrar a0) decorrente do uso de' qqq '")Quando eu quero adicionar assinatura de tipo se falhar:qqq :: Maybe x => x -> IO () ->Type constructor 'Maybe' used as a class -> Mas não é?qqq :: (Maybe x) -> IO (). Agora, a própria assinatura parece ter sucesso. Masmain = qqq (Just 43) começa a falhar com esse misterioso(Show a0) erro como emmain = qqq (Nothing) case.

Questões

Por que ligar para qqq comNothing é tão diferente de ligar comJust 43?O que é(Show a0)? É mencionado apenas em mensagens de erro. Qualquer tentativa de usá-lo leva a algo como "Mostrar fora do escopo".O que é assinatura de tipo correta para isso? Como fazer a assinatura de tipo de impressão Haskell deduzida? Esperando algo como:
f 0 = 2
f x = (f (x-1)) + 3

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

questionAnswers(1)

yourAnswerToTheQuestion