web-dev-qa-db-ja.com

約束は機能的ですか

関数型プログラミングは、遅延評価と一致すると説明されることが多い。

私の知る限り遅延評価は、エバリュエーター/ブラウザー/などの場合にメソッドが呼び出されることを意味します。それが次に良いことだと思います。

遅延評価ここ について読みました。

それは私に考えさせます。 promisesは実行するように設計されており、実行後は次善の策を実行します。あなたは流れを制御します。

私はpromisesが機能することを読みました here


私の小さな脳では、これらの発言は正反対です。

1つは、時間があるときはいつでもステートメントを評価するように言っています。関数型プログラミングには副作用がないため、問題にはなりません。

もう1つは、時間があるときに何かを実行する必要があることを教えてくれますが、その後は非同期動作を使用します。つまり、1つの関数が完了したことを確認してから、次の関数を実行します。

純粋な関数型プログラミングにはプロミスを含めるべきではないと私は言っていますか?そして、promiseを含むその関数は、純粋に純粋ではありませんか?

私は、関数型プログラミングの定義を明確に理解しようとするだけで、約束とコールバックが役立つことを知っています。

4
Randy

私はあなたの投稿内の質問に答えるか、むしろあなたの混乱の原因にもっと興味があります。

タイトルの質問については、約束は機能しますか?はい、可能です。 Haskellでの約束については このページ を参照してください。これは典型的な純粋な機能的なプログラミング言語です。

約束の副作用の性質に関するあなたの混乱は当然のことです。上記のリンクされたページをチェックして、これらの関数のシグネチャを見てください。 IO?これは、関数に副作用がある可能性があるというHaskellの言い方です。

「関数型プログラミングには副作用がない」と述べるのは少し厳しく、技術的に正しくありません。ハードディスクへのアクセス、キーボードからの入力、または画面への出力を許可されていないプログラミング言語を想像してください。ユーザーとしての私たちには、ある時点で副作用の明確な必要性があり、関数型プログラミングは可能な限り純粋な関数を採用するだけです。

@Daenythがすでに指摘したように、遅延評価とFPは異なるものです。最近混乱しているのは、関数型プログラミングという用語がこれらの多くの異なることを意味するために使用されていることです。遅延評価はそれらの1つですが、純粋性、GADT、モナド、パターンマッチング、不変性、その他多くのものが同様にミックスに投入されます。

FPに関するウィキペディアの記事 でもFPとは何かを正確に定義していませんではありません。私が知る限り、関数型プログラミングから取り去ることができず、それを関数型プログラミングと呼ぶことができないのは lambda calculus だけです。

5
Frank