Допустим, у меня есть следующая подпись типа:
someFunction :: (Eq a, Eq b) => a -> b
С реализацией:
someFunction x = (2 :: Int)
(Не заглядывайте слишком далеко, это просто пример).
Мое понимание подписи заключается в том, что «someFunction принимает аргумент, который является экземпляром класса типов Eq, и возвращает значение (которое может быть другого типа), которое является экземпляром класса типов Eq». Int является экземпляром Eq, так почему GHC расстраивается из-за этой реализации?
Ошибка делает это достаточно очевидным:
Couldn't match expected type ‘b’ with actual type ‘Int’ ‘b’ is a rigid type variable bound by the type signature for: someFunction :: forall a b. (Eq a, Eq b) => a -> b
Я думаю, что я не понимаю требования, чтобы это работало "для всех" b. Любой код, использующий эту функцию, должен полагаться только на тот факт, что b является экземпляром Eq, верно? В моей голове реализация соответствует подписи. Что насчет моей реализации нарушает ожидания этой подписи?
b, если этоEq b), но ваша реализация явно возвращает толькоInts. - person Willem Van Onsem   schedule 22.10.2018