タグ付けされた質問 「declarative-programming」

9
宣言型プログラミングの夢[終了]
宣言型プログラミングの夢が実現しなかったのはなぜですか?邪魔になる具体的な障害は何ですか?簡単な例では、なぜ私は言うことができません sort(A) is defined by sort(A) in perm(A) && asc(sort(A)) 自動的にソートアルゴリズムを取得します。permは順列をasc意味し、昇順を意味します。

2
SQLは宣言的ですか?
私が尋ねるのは、SQLで見られる質問の多くが「これは遅いです。どうすれば高速化できますか」ということです。または、「この方法を使用し、高速ではないので、この方法を使用してください」と記載されているチュートリアルです。 SQLの大部分は、式がどのように実行されるかを知っており、その知識から、より良いパフォーマンスの式スタイルを選択しているように思えます。これは、宣言型プログラミングの1つの側面(システムが計算を生成する対象を指定するだけで計算を実行する最適な方法を決定することを離れる)とは異なります。 SQLエンジンは、を使用inしたexistsかjoinどうかを気にしてはいけませんか、それが本当に宣言型である場合、3つの方法のいずれかによって可能であれば、妥当な時間内に正しい答えを与えるべきではありませんか?この最後の例は、冒頭の段落で言及したタイプのこの最近の投稿によって促されます。 インデックス 私が使用できた最も簡単な例は、テーブルのインデックスの作成に関するものだと思います。gumph w3schools.com上、ここでは、でも、パフォーマンス上の理由であり、ユーザが目に見えない何かとしてそれを説明しようとします。それらの記述は、SQLインデックスを非宣言型のキャンプに入れているようで、純粋にパフォーマンス上の理由で手作業で定期的に追加されています。 彼らはどこか他のすべてよりもはるかに宣言的な理想的なSQL DBですが、それは良い人がそれについて聞いていないためですか?

5
関数型プログラミング言語を命令型ではなく宣言型にするのはなぜですか?
関数型プログラミングの利点を説明する多くの記事で、C / C ++ / C#/ Javaなどの命令型言語とは異なる「宣言型言語」と呼ばれるHaskell、ML、Scala、Clojureなどの関数型プログラミング言語を見てきました。私の質問は、関数型プログラミング言語を命令型ではなく宣言型にするものです。 宣言型プログラミングと命令型プログラミングの違いを説明するよくある説明は、命令型プログラミングでは、宣言型言語の「何をすべきか」ではなく「何をするか」をコンピューターに伝えるというものです。この説明に関して私が抱えている問題は、すべてのプログラミング言語で常に両方を実行しているということです。最下位レベルのアセンブリに移動しても、コンピューターに「何をすべきか」と伝え、CPUに2つの数字を追加するように指示します。追加の実行方法については指示しません。Haskellのような高レベルの純粋な関数型言語であるスペクトルのもう一方の端に行くと、実際には特定のタスクを達成する方法をコンピューターに伝えていることになります。それはあなたのプログラムがコンピューターが単独で達成する方法を知らない特定のタスクを達成するための一連の命令です。Haskell、Clojureなどの言語はC / C ++ / C#/ Javaより明らかに高いレベルであり、遅延評価、不変データ構造、匿名関数、カリー化、永続データ構造などの機能を提供することを理解しています関数型プログラミングは可能かつ効率的ですが、宣言型言語として分類しません。 私にとって純粋な宣言型言語は、宣言のみで構成される言語であり、そのような言語の例はCSSです(はい、CSSは技術的にはプログラミング言語ではないことを知っています)。CSSには、ページのHTMLおよびJavascriptで使用されるスタイル宣言が含まれています。CSSは宣言以外に何もできません。クラス関数、つまり、パラメーターに基づいて表示するスタイルを決定する関数、CSSスクリプトを実行できない関数などは作成できません。プログラミング言語)。 更新: 私は最近Prologをいじくり回してきましたが、完全に宣言的なプログラミング言語だけではない場合、Prologは完全に宣言的な言語(少なくとも私の意見では)に最も近いプログラミング言語です。Prologでプログラミングを精緻化するには、ファクト(特定の入力に対してtrueを返す述語関数)またはルール(入力に基づいて特定の条件/パターンに対してtrueを返す述語関数)のいずれかを宣言することによって行われます。パターンマッチング手法を使用して定義されます。プロローグで何かを行うには、述語の1つ以上の入力を変数に置き換えてナレッジベースを照会し、プロローグが述語が成功する変数の値を見つけようとします。 私のポイントは、プロローグには命令的な指示はなく、基本的にはコンピューターに知っていることを伝え(宣言)、知識について尋ねる(問い合わせる)ことです。関数型プログラミング言語では、メモリの場所を直接操作したり、段階的に計算を書き込んだりしていなくても、値の取得、関数Xの呼び出し、それに1の追加などの指示を与えています。私は間違っているかもしれませんが、Haskell、ML、Scala、Clojureでのプログラミングがこの意味で宣言的であるとは言いません。上で説明した意味で、適切で、真で、純粋な関数型プログラミング宣言です。

4
命令型プログラマーに宣言型プログラミングを教えようとするとき、いくつかの良い習慣は何ですか?
私は自分の会社でF#のトレーニングを少し行うことを申し出ましたが、彼らは興味を示しているようでした。彼らは通常、プログラミングにあまり情熱を傾けないVB6およびC#プログラマーです。そうは言っても、機能的なことを考えると正しいコードを書く方が簡単だと思うので、彼らは間違いなく何らかの利益を得るはずです。 誰も私がこれにどのようにアプローチするべきかについていくつかのアドバイスを提供できますか? アイデア 構文に集中するのではなく、代わりにこの言語とそれが促進するイディオムをどのように使用できるかに集中してください。 命令的な方法で書くのは苦痛だが、宣言的な方法で書くとエレガントなコードに変換される例を試してみてください。

2
関数型プログラミング言語は副作用を許可しませんか?
ウィキペディアによると、宣言型である関数型プログラミング言語は、副作用を許可していません。一般に宣言型プログラミングでは、副作用を最小限に抑えたり、排除したりします。 また、ウィキペディアによると、副作用は状態変化に関連しています。したがって、関数型プログラミング言語は、その意味では、状態を保存しないため、実際には副作用を排除します。 しかし、それに加えて、副作用には別の定義があります。副作用 値を返す以外に、呼び出し側の関数または外界との観測可能な相互作用があります。たとえば、特定の関数は、グローバル変数または静的変数の変更、その引数の1つの変更、例外の発生、ディスプレイまたはファイルへのデータの書き込み、データの読み取り、または他の副作用のある関数の呼び出しを行う場合があります。 その意味で、関数型プログラミング言語は実際には副作用を許容します。外部の世界に影響を及ぼし、他の関数を呼び出し、例外を発生させ、ファイルに書き込むなどの無数の例があるからです。 それで、最後に、関数型プログラミング言語は副作用を許可するかどうか? または、何が「副作用」とみなされるか理解していないため、命令型言語では許可され、宣言型言語では許可されません。上記と私が得た結果によると、副作用を排除する言語はないため、副作用について何か見落としているか、ウィキペディアの定義が誤っています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.