これは理論的な質問ですが、私が現在理解しているプログラミングの長年の後に、主にC ++を使用する「通常の」命令型テクニックです。
これにより、完全に状態指向のプログラムを、純粋に機能的で状態のない別の実装に技術的に置き換えることができるのではないかと思いました。
それは興味をそそるアイデアであり、関数型プログラミングには明確で優雅なものがあることを認めなければなりません。
これは理論的な質問ですが、私が現在理解しているプログラミングの長年の後に、主にC ++を使用する「通常の」命令型テクニックです。
これにより、完全に状態指向のプログラムを、純粋に機能的で状態のない別の実装に技術的に置き換えることができるのではないかと思いました。
それは興味をそそるアイデアであり、関数型プログラミングには明確で優雅なものがあることを認めなければなりません。
回答:
簡単な答え:はい。ウィキペディアによると、計算の普遍的なモデルとしてのラムダ計算とチューリングマシンの同等性は、1937年にアランチューリングによって示されました。チューリングマシンの計算モデルは、命令型プログラミングまたはステートフルプログラミングについて話すときに通常念頭に置いているものであり、ラムダ計算は「純粋な関数型プログラミング」の数学的な形式化です。
すべての効果的な計算モデルは、チューリングマシンと同じ計算を実行でき、その逆も同様であると推測されます。これは、教会チューリング論文と呼ばれます。しかし、この推測は多かれ少なかれ「計算の効果的なモデル」という用語のために証明できません(おそらく誰かが将来新しいモデルを発明するでしょうか?)
どんな動的システムでも、「状態」は、あなたの存在があなたの影響を受けるようにするものです過去または未来の(時間の矢は数学的問題ではなく、単に物理的な制約です)。
「覚えておく」何かを持っているか、それはあなたが何をしたかに依存しますが、あなたは状態を持っています。
状態のないシステムは「動的」ではありません。単なる組み合わせの機能です。それは状態を持たないかもしれませんが、異なる結果を生成するためには、何らかの方法で状態を提供する必要があります。
現在、参照している計算モデルに応じて、状態は明示的に(変数の形式で)または暗黙的に(「リターンアドレス」の形式で)表現できます。
あなたがするとき fna(fnb(x))
、fnbに状態が与えられ、fnaの状態が生成されます。これは、x
fnbが呼び出される前に存在するという事実によるものです(したがって、それは独自の「過去」に由来します)。
「国家の存在」や「国家が存在しない」問題ではありません。それは「気にする」または「気にしない」のことです。
状態とは、現在の刺激だけに基づくのではなく、過去の刺激に依存する方法で現在の刺激に応答する能力を意味します。
純粋に機能的なプログラムは単なる機能です。したがって、実際のアプリケーションでは、純粋に機能的なプログラムはペア(old_state * present_stimulus)を入力し、ペア(new_state * present_response)を出力します。次の刺激を待って状態を伝搬するには、外部のステートフルな「ルーパー」が必要です。
純粋に機能的なプログラムは本質的に状態を持たず、実際のアプリケーションに直接使用することはできません。
したがって、状態指向プログラムは、純粋に機能的で状態のない別の実装に置き換えることはできません。
外の世界と対話する必要がない限り、明示的な可変状態を回避できます。
プログラムで実際にプロセッササイクルを占有する以上の効果を得るには、JavaScriptでDomまたはWindowオブジェクトを変更する必要があり、これらのAPIはステートフルです。ただし、DomおよびWindowオブジェクトをパラメーターとしてJavaScriptコードに渡し、新しいDom / Windowを出力として受け取るラッパーを作成できると思います。これにより、JavaScriptコードが可変状態から分離されます。
もちろん、ブラウザウィンドウとDOMは本質的にステートフルであるため、まだ状態に依存しています。対話型アプリケーションは本質的にステートフルですが、明示的な状態を最小限に抑えるようにコードを構造化できます。
別の質問は、それが良いアイデアかどうかです。設計上純粋な関数型言語であるHaskellでさえ、「状態」モナドが含まれており、これにより可変状態をシミュレートできます。これは、明示的な可変状態が時々望ましいパターンであることを示しています。
状態のないプログラミング言語で「状態マシン」をどのように実装するかを考えてください。
おそらく実際に実行できますが、ストレージとして関数名を使用することになります。次のようなgobblyday gookで終わる:
if (sm.atBegining()) sm.start() else if (sm.done()) sm.stop() ) else sm.progress()