Haskell, dlaczego „Num x” wymaga „Show x”?

Ostatnio spojrzałem na Haskella, używającLYAH.

Zajmowałem się klasami typów i napisałem tę funkcję szybkiego testu:

foo :: (Num x) => x -> String
foo x = show x ++ "!"

Ale to powoduje ten błąd:

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

Ale według LYAH:

Aby połączyć się z Numem, typ musi być już zaprzyjaźniony z Show i Eq.

Więc jeśli wszystko w środkuNum jest podzbioremShow iEq, dlaczego muszę zmienić podpis typu nafoo :: (Num x, Show x) => x -> String aby to zadziałało? Czy nie powinno być możliwe wyciągnięcie wniosku, że aNum jest także w stanie pokazać?

questionAnswers(4)

yourAnswerToTheQuestion