web-dev-qa-db-ja.com

関数型プログラミングで条件付きブランチを取り除くにはどうすればよいですか?

OOPでは、該当する場合はいつでもポリモーフィズムを使用して、長時間実行のスイッチケースまたはif-else-if構文を回避します。

値を突き合わせて分岐する代わりに、分岐はクラスレベル自体で行われます。

関数型プログラミングのパラダイム、特にClojureで同様のアプローチをどのように適用できますか?

9

彼らはそれらを避けません、彼らはパターンマッチ構文を使ってそれらを受け入れます。

しかし、関数型プログラミングはオブジェクト指向プログラミングとほぼ直交しているため、「関数型」言語の絶対的な大多数も、clojureを含むオブジェクト指向型です。実際、clojureのマルチメソッドは、最初の引数だけでなく、複数の引数の型で動的にディスパッチできるため、Javaのプレーン仮想メソッドよりも優れています。

動的なポリモーフィズムを持たない純粋に関数型の言語であるHaskellがあります。 Haskellでは、型クラスを介してマルチメソッドを定義できますが、型はコンパイル時に解決されます。実行時にさまざまな型を使用するには、共用体型を作成する必要があり、パターンマッチを使用して関数を記述する(ifチェーンに似ていますが、より便利な構文を使用する)か、または構成要素タイプのメソッド。または、GHC forall拡張機能を使用します。


objectオブジェクト指向とは、言語に、実際の実行時の型に基づいてディスパッチする動的なポリモーフィズムの形式があることを意味します。多くの新しい言語は、「トレイトベース」のポリモーフィズムしか持たないため、インターフェースのみを継承できます。私はそれをオブジェクト指向であるとみなし、この答えの目的にはそれで十分です。

13
Jan Hudec

これは非常に古い質問ですが、答えが不足しているように感じます。

先ほどお話ししたように、OO=では、分岐はクラスレベルに頻繁に移動されます。それが何を意味するのか考えてみましょう。

  1. ファクトリメソッドは分岐を処理し、派生クラスを返します。
  2. 派生クラスは、効率化されたメソッドのコレクションです。
  3. したがって、ファクトリメソッドは、効率化されたメソッドを返すメソッドです。

それがまさにそれを処理する方法です。高次関数です。高次関数は分岐を処理し、効率化された関数を使用して返します。

あなたの質問の文脈では、ポリモーフィズムはそれを少し抽象化したものであり、型安全性が追加されています。

4
Daniel