Это, наверное, очень простой вопрос, но...
Функция, которая определяется, скажем, как
foo :: a -> Integer
обозначает функцию от любого типа до 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
Почему такое ограничение?