Я пытаюсь выяснить причины и следствие логики позади «Карринг» и приходит к следующим результатам:Почему Haskell принимает один аргумент
- Несколько аргументов функция может быть выражена либо как кортеж (объединения нескольких аргументов с разными типами в качестве одного аргумента) и список (объединение нескольких аргументов с тем же типом, что и один аргумент). Таким образом, все функции могут быть выражены как одна функция аргументов.
- Так что в функции Haskell функция принимает только один аргумент. Как мы можем реализовать функцию с несколькими аргументами.
- Использование Currying. Currying - это способ реализации нескольких аргументов.
Я думаю, что приведенная выше логика 1 -> 2 -> 3 сбивает с толку ответ «зачем использовать каррирование». Для оператора 3 также можно комбинировать несколько кортежей или списков в качестве единственного аргумента для реализации функции множества аргументов.
Кажется, что утверждение 1 является неправильной причиной для утверждения 2. То, что я уверен, является 2-> 3 правильным аргументом, но в чем причина 2? Почему Haskell, как функциональный язык, принимает только один аргумент?
Большинство книг принимают заявление 2 как общепринятый факт. Кто-нибудь знает причину 2? Или кто-нибудь знает правильную логику «почему карри»?
Вы спрашиваете: «Зачем использовать currying?», Что подразумевает, что в какой-то момент кто-то подумал: «Давайте использовать currying для решения проблемы дизайна языка, который у нас есть». Но на самом деле этого не произошло. Кто-то подумал: «Давайте сделаем простой, элегантный, выразительный, удобный, безопасный и гибкий язык». Решениями этих проблем являются использование лямбда-исчисления с индуктивными типами, хорошая система типов и несколько необычная стратегия сокращения. «Использовать каррирование» - это не решение какой-либо одной из этих проблем, а скорее случайный инструмент в системе, который решает эти проблемы. –
Если вы думаете о кортежах, подобных типам товаров (например: «Bool» имеет двух жителей: «Возможно, у Bool» три человека, «(Bool, Maybe Bool)» имеет шесть жителей), тогда типы функций являются показателями. Поскольку 'e^(x * y) = (e^x)^y', вы всегда можете переписать функцию с типом' (x, y) -> e' в аналогичную функцию с типом 'y -> (x - > e) '. Это вкратце. Поскольку вы всегда можете переписать такие функции (в данном случае, при относительно низкой стоимости), вам не нужно * делать многопараметрические функции фундаментальной концепцией, которая в противном случае усложняла бы ваше определение языка. –