Haskell, разница между суммой (x, y) и суммой (x, y, z) - PullRequest
2 голосов
/ 18 марта 2019

Меня смущают различия между sum (x,y) и sum(x,y,z). Подпись типа sum выглядит как (Foldable t, Num a) => t a -> a. Что я получаю, так это то, что он принимает складную t и класс типов Num a. Sum (x, y) всегда выводит y, а sum (x, y, z) выдает ошибку:

 "Could not deduce (Foldable ((,,) Integer Integer))
        arising from a use of `sum'"

Так почему сумма (x, y) способна вывести что-то по сравнению с суммой (x, y, z)

1 Ответ

5 голосов
/ 18 марта 2019

И в Python, и в Haskell (x,y,z) - это кортеж, тогда как [x,y,z] - это список.Однако, хотя списки практически одинаковы в обоих языках, кортежи различны: кортежи Python похожи на списки Python, тогда как в Haskell кортежи представляют собой совершенно другую концепцию ( EDIT: Я был неправ);в Haskell кортежи похожи на записи без имен полей (например, (1, "foo", 'b') имеет тип (Int, String, Char)).Таким образом, в Haskell вы не можете суммировать кортежи в целом (поскольку вы не можете гарантировать, что каждое «поле» относится к одному и тому же типу), что в сущности означает Could not deduce Foldable.Однако экземпляр Foldable в Prelude существует для двух кортежей!Однако, как прокомментировал @RobinZigmond, он работает не так, как вы ожидаете: поскольку он не может гарантировать, что оба поля имеют одинаковый тип, он просто полностью игнорирует первый элемент:

Prelude> sum (1,2)
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...