関数型プログラミング-標準記号、図など
-
05-07-2019 - |
質問
問題がありますが、機能的なスタイルのプログラミングで解決するのが最善だと思います。
非常に命令的な背景から来て、私はクラス図/説明、コミュニケーション図、状態図などを含むプログラムの設計に慣れています。しかし、これらの図はすべて、システムの状態やさまざまなアクションがシステムに及ぼす副作用。
関数型プログラムの設計に使用される標準化されたダイアグラムまたは数学記号のセットはありますか、または短い関数型擬似コードで最適に設計されたプログラムですか(関数が命令型よりもはるかに短い場合)。
ありがとう、マイク
解決
関数型プログラミングには秘secretがあります。
-
ほとんどステートレスであるため、従来の命令図は関係ありません。
-
ほとんどの一般的な園芸品種の数学表記もステートレスです。
機能設計は、他の何よりも代数に似ています。関数を定義し、それらの関数の構成が望ましい結果を生成することを示します。
ダイアグラムは、関数型プログラミングが手続き型プログラミングよりもいくぶん単純なので、必要ではありません。従来の数学表記に似ています。数学的手法を使用して、さまざまな機能が適切に機能することを示します。
他のヒント
関数型プログラマーは、ダイアグラムを書くよりも方程式を書くことに熱心です。このゲームは equational reasoning と呼ばれ、ほとんどの場合
-
等しいを等しいに置き換える
-
代数則の適用
-
帰納法による時折の証明
アイデアは、「マニフェストが正しい」本当にシンプルなコードを記述し、方程式推論を使用して、よりクリーンな、またはパフォーマンスが向上するものに変えるというものです。この芸術の巨匠はリチャード・バードというオックスフォードの教授です。
たとえば、Scheme式を簡略化する場合
(append (list x) l)
私は、クレイジーのようなイコールをイコールに置き換えます。 list
の定義を使用して取得
(append (cons x '()) l)
私が持っているアペンドの本文を置き換える
(if (null? (cons x '()))
l
(cons (car (cons x '())) (append (cdr (cons x '())) l)))
今、これらの代数則があります:
(null? (cons a b)) == #f
(car (cons a b)) == a
(cdr (cons a b)) == b
そして「等しい」を「等しい」に置き換える
(if #f
l
(cons x (append '() l))
別の法律により、(if #f e1 e2)== e2
、私は得る
(cons x (append '() l))
そして、追加の定義をもう一度使うと、次のようになります
(cons x l)
私が証明したことは
と等しい <*>- アニメーションを使用してLambda Calculusを説明する次の非常に良い記事があります。 Mockingbirdを分析するには:アニメーション化された削減
- これは前のものと非常に似ていますが、実際の実装があります: Lambda Animator
関数型プログラミングについてはあまり知りませんが、ここで私が遭遇した2つのことがあります
- &#955; (lambda)は、しばしば 関数
- f&#959; gは機能を示すために使用されます 構成