web-dev-qa-db-ja.com

Rustは関数型プログラミングのイディオムをサポートしますか?

Rustがますます具体化するにつれて、それに興味が湧き始めます。代数的データ型、特にそれらのマッチングをサポートしているという事実が大好きですが、何か考えはありますか?他の機能的なイディオム?

  1. 例えば。標準ライブラリに標準のfilter/map/reduce関数のコレクションがありますか?さらに重要なのは、構文的に適切な方法でそれらをチェーン/構成できますか[1]。

  2. ADTを使用するためのエレガントな手段がすでにあるので、モナド、特にそれらの構文糖衣はどうですか?

[1] Haskellは(。)と(>>>)、C#拡張メソッド、およびオプションでLINQを取得し、Dは統一された関数呼び出し構文を持っています。

26
Sebastian Graf

RustにはHKTはありませんが、そのイテレータdoは、mapのような高階関数(HOF)を使用した関数スタイルでのコーディングをサポートしています。 filterfoldなど、便利な連鎖。

詳細は関数型言語とは異なります。通常はガベージコレクションですが、Rustプログラムは、C++ RAIIと同様に、プログラムのフローの一部としてメモリ管理を決定論的に処理します。

効率的な連鎖を可能にするために、個々のHOFは構成可能な遅延式テンプレートを返し、.to_owned_vec()または.collect()またはで終了することにより、最終結果をデータに変換できます(1つのステップで割り当ておよび評価)。なんでも。

状況によっては、これは必要ありません。返される式テンプレートはイテレータ自体であり、それで十分な場合があります。たとえば、forループを使用してそれを反復処理したり、ジェネリック関数に引数として渡すことができます。

見る:

同様のパターンは、C++ 11(追加のライブラリを含む)とRustの両方で可能です。 RustのジェネリックはC++テンプレートほど強力ではありませんが、デフォルトでは不変性、式指向構文、多形ラムダ、および双方向型推論により、関数型言語に少し近い感じがします。

「拡張メソッド」と統一呼び出し構文に関して、Rustは、コードを編成する同様の「オープンワールド」方法を可能にします。implsを、より多くのメソッドとともに、内の任意のタイプに追加できます。ライブラリまたはプログラム、または独自のトレイトのメソッドを実装することにより、他のライブラリから既存のタイプを拡張します。

これにより、C++よりもチェーン可能なメソッド呼び出しスタイルを簡単に使用できるようになります(つまり、型を変更または派生する必要が少なくなります)。

Haskellのイディオムの多くは純粋性に関係していることを覚えておいてください(たとえば、IOモナド、レンズ..)、およびRustはマルチパラダイムであり、純粋関数型:プログラムレベルで参照の透明性を確保するために純粋関数を使用できますが、その実装は可変ローカル変数によって簡略化されています。

24
centaurian_slug

ファンクター、アプリケーション、モナドなどの概念をサポートするには、言語に「より高い種類のタイプ」が必要です。言い換えれば、言語は*-> *である型、または型から型への関数を抽象化できなければなりません。 Rustは現在、このレベルの抽象化をサポートしていません。将来の方向性として 議論 ですが、すぐに焦点になるとは思いません。

16
MFlamer