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?

questionAnswers(4)

yourAnswerToTheQuestion