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"