問題タブ [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.

0 投票する
2 に答える
642 参照

haskell - ランタイムは通常、関数型言語コードの命令型の解釈を使用しますか

関数型言語の通訳について一般的な質問があります。

実行時に関数型言語と命令型言語を使用すること(またはインタプリタに到達すること)に実際に利点はありますか?

私が見た質問(このような)はどれも実際にはこの質問に到達せず、検索にはさまざまな言語の定義に関する議論が殺到しています。

編集:私が答える必要があった唯一の質問に取り除いた。

0 投票する
2 に答える
188 参照

algorithm - オペレーターのなぞなぞ

プロジェクトを Python から C# に変換しているときに、構文ファミリにいくつかの興味深い違いがあることに気付きました。それでも、C#の比較演算子の異なる動作を理解して理解することができず、行き詰まりました。

この好奇心を治す過程で、私は C 構文ファミリーのいくつかの言語を検討しました。C, C++, C#, Java, Javascript.. 動作確認済み。これがどのように発生したかです:

ここで、次の式を考えてみましょう。

右結合性が原因である場合、JavaScript の次のコードは次のように動作しないはずです。

C/C++版はこちら

Python を除いて、どこで

C ファミリーの言語と Python で式の計算方法が異なる理由を説明できる人はいますか?

0 投票する
1 に答える
1491 参照

user-interface - オブジェクト指向ではない GUI ライブラリは?

私は最近 C をよく使用しており、単なるコンソール アプリケーション以上のプログラミングを探求したいと考えています。ただし、ほとんどの GUI ライブラリはオブジェクト指向であり、C などのオブジェクト指向ではないプログラミング言語でそれらを使用してプログラミングすることは非常に困難です。C 用に設計された GTK+ などのオブジェクト指向の GUI ライブラリでさえ、多くのボイラープレート。これらのオブジェクト指向ライブラリに問題があるため、どの GUI ライブラリがオブジェクト指向ではないのだろうか?

0 投票する
5 に答える
2069 参照

haskell - 宣言型言語

Declarative Programming Languagesに関する記事を読んでいました。

このタイプ/パラダイムのプログラミング言語の性質が理解できず、それが命令型言語とは対照的である場合、Haskell などのこのタイプのプログラミング言語でのプログラミングについて読んでから、後でその記事を読む必要がありますか?

0 投票する
7 に答える
156 参照

c# - ループ反復間でコードを実行する

次のように 3 つの要素をループしたいとします。

もちろん、これは次のように言っているのと同じです: doSomething(); doSomething(); doSomething();.

さて、これをコーディングしているかのように、各反復の間に何かをしたいとしましょう: doSomething(); doBetween(); doSomething(); doBetween(); doSomething();

doSomething()が 3 回呼び出されているのに、 2 回呼び出されていることに注意してくださいdoBetween()

現在、ループでこれを行う方法を知っている唯一の方法は次のとおりです。

私には、その条件をループ内で実行するのは効率が悪いように思えます。また、プログラミングの意図を理解するために、2 回見なければならなくなります。さらに、「for」ヘッダーの「3」を別のものに変更すると、特にロジックが大きくなるにつれて、条件の変更を簡単に忘れてしまう可能性があります。それだけでなく、最後の反復を実行しているかどうかを簡単に検出する方法がないため、このトリックは foreach ループでは機能しません。

パフォーマンス、可読性、保守性、または foreach ループを向上させる方法で、このようなことを行うためのヒントはありますか?

0 投票する
1 に答える
638 参照

performance - 命令型プログラミングと関数型プログラミングの効率

IPとFPのパフォーマンスについて質問があります。n番目のフィボナッチ数を計算する関数があるとしましょう。

命令型プログラミングでは、反復法、再帰、または動的計画法を使用してn番目のフィボナッチ数を計算することを選択できます。もちろん、反復計画法と動的計画法は、漸近的に再帰する場合に比べてパフォーマンスが向上します。

関数型プログラミングでは、関係する状態がないと仮定すると、再帰的な方法でしか実行できません。

この場合、関数型プログラミングは、効率の点で(漸近的に)命令型プログラミングと比較して、常に同等または低速で実行されるという意味ではありませんか?

実際の関数型プログラミングはこの問題にどのように対処しますか?

0 投票する
1 に答える
210 参照

python - テーブルを純粋関数に「成長させる」命令型アルゴリズムの変換

Python 3で書かれた私のプログラムには、(非常に大きな)テーブルのような数値データ構造で始まり、特定のアルゴリズムに従って列を追加する場所がたくさんあります。(アルゴリズムは場所によって異なります。)

命令型アプローチで問題が発生したため、これを純粋関数アプローチに変換しようとしています(再利用が難しい、中間ステップをメモするのが難しい、「遅延」計算を実現するのが難しい、状態に依存しているためにバグが発生しやすいなど)。 。

このTableクラスは、ディクショナリのディクショナリとして実装されます。外部ディクショナリには、row_id;でインデックス付けされた行が含まれます。内部には、。でインデックス付けされた行内の値が含まれますcolumn_title。テーブルのメソッドは非常に単純です。

これまでは、元のテーブルに列を追加するだけで、各関数はテーブル全体を引数として取りました。純粋関数に移行するときは、すべての引数を不変にする必要があります。したがって、初期テーブルは不変になります。追加の列はスタンドアロン列として作成され、それらを必要とする関数にのみ渡されます。典型的な関数は、初期テーブルと、すでに作成されているいくつかの列を受け取り、新しい列を返します。

私が遭遇する問題は、スタンドアロン列(Column)を実装する方法です。

それぞれを辞書にすることもできますが、とても高額なようです。実際、たとえば、各論理行の10個のフィールドに対して操作を実行する必要がある場合は、10個の辞書検索を実行する必要があります。さらに、各列にはキーと値の両方が含まれ、サイズが2倍になります。

Column簡単なリストを作成し、row_idから配列インデックスへのマッピングへの参照をそのリストに格納できます。利点は、このマッピングを同じ初期テーブルに対応するすべての列で共有でき、一度検索すると、すべての列で機能することです。しかし、これは他の問題を引き起こしますか?

これを行う場合、さらに進んで、実際にマッピングを初期テーブル自体の中に保存できますか?また、オブジェクトからの参照を、Columnそれらが作成された最初のテーブルに戻すことはできますか?機能的なアプローチを想像した方法とは大きく異なるように見えますが、すべてが不変であるため、それがどのような問題を引き起こすのかわかりません。

一般に、機能的アプローチは、引数の1つへの戻り値の参照を維持することに眉をひそめますか?とにかく議論はすでに知られているので、それが何か(最適化や遅延評価など)を壊すようなことはないようです。しかし、多分私は何かが欠けています。

0 投票する
3 に答える
880 参照

type-inference - 静的、構造型、グローバル型推論を備えた命令型言語

Haskellのような言語が静的に型付けされ、型推論を持っていることを私は知っています。しかし、グローバル型推論を備えた非関数型言語はありますか。これは、型推論と構造型を備えたCのようなものに相当します。

0 投票する
3 に答える
1954 参照

functional-programming - 関数をテーブルルックアップに置き換える

私はBrianBeckmanと一緒にこのMSDNビデオを見てきましたが、彼の言うことをもっとよく理解したいと思います。

すべての必須プログラマーは、関数をテーブルルックアップに置き換えることができることを学習するこのフェーズを通過します

今、私は大学に行ったことがないC#プログラマーなので、おそらくどこかで、他の誰もが理解できることを見逃してしまいました。

ブライアンとはどういう意味ですか:

関数はテーブルルックアップに置き換えることができます

これが行われている実際的な例はありますか?それはすべての機能に適用されますか?彼は私が理解できる罪の機能の例を挙げていますが、もっと一般的な言葉でこれをどのように理解するのですか?

0 投票する
6 に答える
1498 参照

c++ - 関数型プログラミングにおける純粋関数の欠点

関数型プログラミングの純粋関数は、副作用のない関数です。これの意味の1つは、入力パラメーターの値を変更できないことです。これはメモリ使用率の不利と見なすことができますか?
たとえば、リストを取得して別の要素を追加するだけの関数があるとします。C ++では、次のように単純にすることができます。

この関数は明らかに、渡されたオブジェクトによってすでに使用されているよりも多くのメモリを使用しません。
しかし、Haskellでも同じことがこのようなものになるでしょう。

xsは値を変更していないため、この計算では。したがって、関数がxsの2倍のサイズのメモリを消費することになると言っているのは正しいですか。1つはxs用で、もう1つは戻り値用です。または、どういうわけか怠惰な呼び出しは、最後に1つの要素のみを追加することによって、実際にxsが返されることを確認しますか?
私はモナドが副作用をもたらす可能性のある何かを持つ方法であることを知っています。しかし、Monadを使用して、入力を変更し、その値を返すことはできますか?
また、xs ++ [a]をa:xsに変更すると、消費するメモリが少なくなりますか?