Подтвердить что ты не робот

Does/Will Rust поддерживает функциональные идиомы программирования?

По мере того, как Rust становится все более и более, мой интерес к нему начинает раздражать. Мне нравится тот факт, что он поддерживает алгебраические типы данных и, в частности, их сопоставление, но есть ли какие-либо мысли о других функциональных идиомах?

  • например. существует ли сборник стандартных фильтров/карт/функций сокращения в стандартной библиотеке, и что более важно, можете ли вы сгруппировать/скомпоновать их синтаксически приятным образом [1]?

  • Так как уже есть изящные средства для использования ADT, как насчет монадов, в частности, синтаксического сахара?

[1] Haskell получил (.) и ( → > ), методы расширения С# и, возможно, LINQ, D имеет унифицированный синтаксис вызова функции.

4b9b3361

Ответ 1

Rust не имеет HKT, но его итераторы поддерживают кодирование в функциональном стиле с функциями более высокого порядка (HOF), такими как map, filter, fold и т.д., с удобной цепочкой.

Детали отличаются по сравнению с функциональными языками - обычно это сбор мусора, тогда как программы Rust детерминируют управление памятью, подобно С++ RAII, как часть потока программы.

Чтобы обеспечить эффективную цепочку, отдельные HOF возвращают составные ленивые шаблоны выражений, и вы можете превратить конечный результат в данные (распределение и оценка за один шаг), закончив с помощью .to_owned_vec() или .collect() или что-то еще.

В некоторых ситуациях это необязательно, возвращаемый шаблон выражения - это итератор, и этого может быть достаточно. Например, вы можете перебрать это с помощью цикла for или передать его как аргумент общей функции.

См:

Подобные шаблоны возможны как в С++ 11 (с дополнительными библиотеками), так и в Rust. Родовые дженерики не такие мощные, как шаблоны С++, но неизменяемость по умолчанию, синтаксис, ориентированный на выражение, полиморфные lambdas и двунаправленный вывод, дают ему немного ближе к функциональному языку.

Что касается "методов расширения" и равномерного синтаксиса вызова, Rust допускает аналогичный способ "открытого мира" для организации кода. Вы можете добавить impl с большим количеством методов в любой тип в любом месте библиотеки или программы или расширить существующие типы из других библиотек, реализовав на них свои собственные методы.

Это упрощает использование стиля вызова метода chainable, чем в С++ (т.е. меньше необходимости изменять или выводить типы).

Помните, что многие икомы Хаскелла связаны с чистотой (например, монада IO, линзы..), а Rust - это мультипарадигма, а не чисто функциональная. Вы можете иметь чистую функцию для преимуществ ссылочной прозрачности на уровне программы, и все же ее реализация упрощается с помощью изменяемых локальных переменных.

Ответ 2

Язык должен иметь "более высокие типы" для поддержки таких понятий, как "Функторы", "Применения" и "Монады". Другими словами, язык должен быть способен абстрагироваться от типов, которые являются * → *, или от типа к типу. В настоящее время Rust не поддерживает этот уровень абстракции. обсуждалось как возможное будущее направление, но я не ожидал, что это будет в ближайшее время.