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ć?