問題タブ [imperative-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - コンパイラで最適化された関数型コードが命令型コードよりも優れたパフォーマンスを発揮する例
副作用のない、参照透過的な関数型プログラミングの約束の 1 つは、そのようなコードを広範囲に最適化できることです。ウィキペディアを引用するには:
多くの場合、データの不変性は、コンパイラが命令型言語で安全でない仮定を行うことを可能にすることで、実行効率につながり、インライン展開の機会を増やします。
より最適化されたコードを生成することで、関数型言語コンパイラが命令型コンパイラよりも優れている例を見たいと思います。
編集:特定のシナリオを提示しようとしましたが、どうやらそれは良い考えではありませんでした。なので、別の方法で説明しようと思います。
プログラマーはアイデア (アルゴリズム) を機械が理解できる言語に翻訳します。同時に、翻訳の最も重要な側面の 1 つは、人間も結果のコードを理解できることです。残念ながら、多くの場合、トレードオフがあります。簡潔で読みやすいコードは、パフォーマンスが低下し、手動で最適化する必要があります。これはエラーが発生しやすく、時間がかかり、コードが読みにくくなります (完全に読みにくくなります)。
不変性や参照透過性などの関数型言語の基盤により、コンパイラは広範な最適化を実行できます。これにより、コードの手動最適化が置き換えられ、プログラマはこのトレードオフから解放される可能性があります。次のようなアイデア(アルゴリズム)とその実装の例を探しています。
- (機能的な) 実装が元のアイデアに近く、理解しやすい。
- 言語のコンパイラによって広範囲に最適化されています。
- 簡潔さと可読性を低下させる手動の最適化なしでは、命令型言語で同様に効率的なコードを書くことは困難 (または不可能) です。
少し曖昧で申し訳ありませんが、アイデアが明確になることを願っています。回答に不必要な制限を加えたくありません。誰かがそれをよりよく表現する方法を知っていれば、私は提案を受け入れます。
私の興味は理論的なことだけではありません。このような例を (とりわけ) 使用して、学生が関数型プログラミングに興味を持つように動機付けたいと思います。
最初は、コメントで提案されたいくつかの例に満足できませんでした。考え直して、私は反対意見を撤回します。これらは良い例です。人々がコメントして投票できるように、自由に完全な回答に拡張してください。
(そのような例の 1 つのクラスは、複数の CPU コアを利用できる並列化されたコードである可能性が最も高いでしょう。多くの場合、関数型言語では、コードの単純さを犠牲にすることなく、これを簡単に実行できます (適切な場所に追加することにより、Haskell のように) par
。pseq
そのような例にも興味がありますが、他の非並列例にも興味があります。)
c - オブジェクトとインスタンスは、オブジェクト指向と比較して、Cのような命令型言語にとって何か他のものを意味しますか?
実行中のCプログラムは「インスタンス」と呼ばれることがあると読みました。これは本当に正しいですか?インスタンスという単語は通常、OOPに使用されます。また、Cにも「オブジェクト」がありませんが、OOPと同じではありません。Cの「オブジェクト」は、ある値を持つ和集合のようなメモリ内の何かであり、オブジェクトと呼ばれる可能性がありますね。
functional-programming - 関数型プログラミングにおける「どうやって何をするか」または「ステップではなく結果に焦点を当てる」とは正確には何ですか
関数型プログラミングにおける「方法を考えるのではなく、何をするか」(ステップではなく結果に焦点を当てる) という概念を理解するのに苦労しています。関数を第一級市民として扱い、反復用の組み込み関数を持たない言語があるとします (Scala の forAll など)。その場合、まず、与えられたデータ構造を反復する方法を指示する関数を作成する必要がありますよね? したがって、言語自体が十分な機能を提供しない場合、ファーストクラスの市民として機能することを除けば、命令型のコーディングとほとんど同じではないでしょうか?
私が間違っている場合は、私を修正してください。以下は私が参照したリソースです。
ocaml - OCaml: 命令型コードで戻り値を捨てる
関数の戻り値をうまく捨てて、ユニットを返すかのように扱うにはどうすればよいですか (明らかに副作用のため)。明白なアプローチはこれを行うことです:
ただし、コンパイラは、戻り値の型がsome_ignored_thing
ユニットではないことを (警告と共に) 訴えます。
次のような独自の方法を発明できます。
少なくとも簡潔に見え、何かが起こっていることを示していますが、同じことを達成する言語/標準ライブラリには何かありますか? 比較的一般的な使用例だと思いました。
functional-programming - 複数のファイルを持つレコードの可変フィールド
複数のファイルを扱っていますが、1 つの可変フィールドに問題があります。file1.ml で、次のように宣言しました。
したがって、file2.ml には mytype 型の要素があります。しかし、私が作ろうとしているとき:
次のエラーが返されます: エラー: レコード フィールド ラベル番号がバインドされていません。
ありがとう、どんな助けでも大歓迎です。
while-loop - 試行中に型を返す
このウェブサイトの質問に答えようとして、ほぼ初めて ocaml で命令型コードを書こうとしていますが、ちょっとした問題に直面しています。
彼は、この関数が try ブロックにあるように unit を返すが、try ブロックは int を返すと考えているため、これが好きではありません。したがって、「完了」の後に 3 を追加すると機能しますが、実際には 3 が返されないため、非常に見苦しくなります。
これどうやってやるの ?
python - シンプルな命令型アルゴリズムを関数型スタイルに変換する
私は最近、コードのスニペットから関数の引数を取り除き、最も外側の関数のみを保持する小さなアルゴリズムを作成しました。
このアルゴリズムは、命令型の方法で設計するのが非常に簡単であることがわかりました。
しかし、私は関数型プログラミングに非常に興味があり、関数型の方法で同じことをどのように達成するのか疑問に思っていました.
そのようなアルゴリズムがどのように機能するかを教えていただければ、非常に役に立ちます。関数型プログラミングがどのように機能するかについて、より良いアイデアが得られるかもしれません。また、アルゴリズムを設計する際の思考プロセスについても知りたいです。
Python で命令型バージョンを作成しましたが、答えは Python である必要はありません。haskell やその他の言語でも同様です。
これが何をするかです(文字列を入力として取り、文字列を返します):
そして、ここに私の命令コードがあります:
paradigms - 命令型プログラミング パラダイムは前方宣言規則に準拠する必要がありますか?
言語プログラミングのコースの試験で、次の質問がありました。
次のプログラムは命令型プログラミングで有効ですか?
または文法、構文、または余分なものが指定されていませんでした。私の答えはイエスでした。最終的には、宣言せずにzを使用し、zを後で「再宣言」する有効な言語、構文、および文法設計が存在する可能性があるためです。私の成績は 0.0 でしたが、それでも不公平だと思います。問題を明確にするのに役立ちますか?. 感謝。