Haskell por que “Num x” exige “Show x”?
Recentemente eu dei uma olhada no Haskell, usandoLYAH.
Eu estava brincando com classes de tipo e escrevi esta função de teste rápido:
foo :: (Num x) => x -> String
foo x = show x ++ "!"
Mas isso produz esse erro:
test.hs:2:9:
Could not deduce (Show x) arising from a use of `show'
from the context (Num x)
bound by the type signature for foo :: Num x => x -> String
at test.hs:1:8-29
Possible fix:
add (Show x) to the context of
the type signature for foo :: Num x => x -> String
Mas de acordo com o LYAH:
Para se juntar a Num, um tipo já deve ser amigo de Show e Eq.
Então, se tudo emNum
é um subconjunto deShow
eEq
, por que preciso alterar a assinatura de tipo parafoo :: (Num x, Show x) => x -> String
para isso funcionar? Não deveria ser possível inferir que umNum
também é Show-able?