Это, вероятно, очень простой вопрос, но...
Функция, определенная как, скажем,
foo :: a -> Integer
обозначает функцию от любого типа до целого. Если это так, то теоретически нужно уметь определять его для любого типа, например,
foo 1 = 10
foo 5.3 = 100
foo (x:xs) = -1
foo _ = 0
Но Haskell допускает только общее определение, например foo a = 0
.
И даже если вы ограничите a
как один из определенного класса типов, например экземпляр класса Show:
foo :: (Show a) => a -> Integer
вы все еще не можете сделать что-то вроде
foo "hello" = 10
foo _ = 0
хотя "hello" :: [Char]
является экземпляром Show
Почему существует такое ограничение?