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

関数型プログラミングは、抽象化を構築し、コンピュータプログラムを構成する計算を表現するための手段として主に関数を使用するプログラミングパラダイムです。

1
代数的データによる制約ベースの型推論
私はML系図の表現ベースの言語に取り組んでいるので、当然、型推論が必要です> :) 現在、EOPL(Friedman and Wand)の単純な実装に基づいて、制約ベースのソリューションを型推論の問題に拡張しようとしていますが、それらはエレガントに代数的データ型を回避しています。 これまでのところ、スムーズに機能しています。式がある場合eでa + b、e : Int、a : Intとb : Int。e一致する場合、 match n with | 0 -> 1 | n' -> n' * fac(n - 1)`, 私は当然と推論することができt(e) = t(the whole match expression)、t(n) = t(0) = t(n')、t(match) = t(1) = t(n' * fac(n - 1)のように... しかし、代数的データ型に関しては、私は非常に確信が持てません。filterのような関数を想定します。 let filter …

1
ML型推論の指数コストの簡潔な例
OCamlのような関数型言語での型推論のコストは非常に高くなる可能性があることに私の注意が向けられました。各式について、対応する型の長さが式の長さに対して指数関数的であるような一連の式があるという主張です。 以下のシーケンスを考案しました。私の質問は次のとおりです。同じ型を実現する、より簡潔な式のシーケンスを知っていますか? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a -> 'b) -> 'b -> …

2
純粋なデータフロースタイルで「増分更新」関数を構成するためのパラダイムはありますか?
この質問をするための正しい用語がわからないので、代わりにたくさんの言葉で説明します。 背景、同じページにいるだけです。プログラムにはキャッシュが含まれていることが多く、時間とメモリのトレードオフです。プログラマーのよくある間違いは、上流のソース/前例の1つを変更した後、キャッシュされた値を更新するのを忘れることです。しかし、データフローまたはFRPプログラミングパラダイムは、そのような間違いの影響を受けません。純粋な関数がいくつかあり、それらを有向ディペンデンシーグラフで接続している場合、ノードは出力値をキャッシュし、関数の入力が変更されるまで再利用できます。このシステムアーキテクチャは、Dataflowベースの環境でのキャッシングペーパーで説明されており、命令型言語では、メモ化とほぼ同じです。 問題:関数への入力の1つが変化しても、関数全体を実行し、キャッシュされた出力を破棄して、最初から再計算する必要があります。多くの場合、これは私にとって無駄に思えます。「トップ5なんでも」リストを生成する簡単な例を考えてみましょう。入力データは、何も並べ替えられていないリストです。ソートされたリストを出力する関数への入力として渡されます。これは、最初の5項目のみを受け取る関数に入力されます。疑似コード: input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45] intermediate = sort(input) final_output = substring(intermediate, 0, 5) ソート関数の複雑さはO(N log N)です。ただし、このフローは、1つの要素を追加することで、入力が一度に少しだけ変化するアプリケーションで使用されることを考慮してください。毎回最初から再ソートするよりも、実際にはO(N)の方が、新しい要素を正しい位置に挿入することにより、古いキャッシュソートリストを更新する関数を使用する方が高速です。これはほんの一例にすぎません-多くの「最初から」の関数には、そのような「増分更新」の対応物があります。また、新しく追加された要素は5番目の位置にあるため、final_outputにも表示されない場合があります。 私の直感は、このような「増分更新」関数を、既存の「最初から」関数と並べて、データフローシステムに何らかの方法で追加できる可能性があることを示唆しています。もちろん、すべてを最初から再計算すると、常に一連の増分更新を実行した場合と同じ結果が得られます。システムは、その性質を持っている必要がある場合は、個々のプリミティブFromScratch-インクリメンタルペアのそれぞれが常に同じ結果が得られ、その後、彼らから構築された大規模複合機能も自動的に同じ結果を与える必要があります。 質問:FromScratch関数とそのインクリメンタル関数の両方をサポートし、効率を高めるために協力し、大きなフローに構成できるシステム/アーキテクチャ/パラダイム/メタアルゴリズムを使用することは可能ですか?そうでない場合、なぜですか?誰かがこのパラダイムをすでに研究して公開している場合、それは何と呼ばれ、どのように機能するかの簡単な要約を入手できますか?

4
関数コードが正しいことを証明するための一般的な正式なテクニックは何ですか?
論文の一部として作成しているHaskellプログラムの一部の証明を提供したいと思います。しかし、これまでのところ、良い参考資料を見つけることができませんでした。 グラハムハットンの入門書 『Haskellでのプログラミング(Googleブックス)』は、Haskellの学習中に読んだものですが、次のようなプログラムについて推論するためのいくつかのテクニックに触れています。 等式推論 重複しないパターンを使用する リストの誘導 第13章で説明しますが、あまり詳細ではありません。 Haskell、またはその他の機能的なコードの正式な証明手法の詳細を提供する推奨できる本や記事はありますか?

1
自己型は帰納的構造の計算を時代遅れにしますか?
自己型は、言語がスコットエンコーディングでエンコードされた代数的データ型を表現できるようにする、構造の計算[1]の拡張です。Scott Encodingは、でパターンマッチングする機能を提供しますO(1)。これは、CCに帰納的定義を含める主な動機の1つです。しかし、自己型ははるかに単純でエレガントな基本理論を実現し、一見すると強力なようです。 セルフタイプは、理論的な観点から、CICを時代遅れにしますか、それとも、CICがSelf Tyesに関して有利であるいくつかの側面がありますか? [1] http://staff.computing.dundee.ac.uk/pengfu/document/talks/mvd-2012.pdf

3
匿名ラムダ関数(関数型プログラミング)
匿名(ラムダ)関数とは何ですか?関数型プログラミング言語における無名関数の正式な定義は何ですか? 簡単に言うと、scheme / lispでプログラミングしているとき、匿名(ラムダ)関数は識別子にバインドされていない関数だと思います。 ラムダ関数について正式に言えるのはそれだけですか?この単純な定義に追加できる詳細があると思います。詳しく説明していただき、ありがとうございます。


1
λ-calculus:関数のメモリ表現で最も効率的なものは何ですか?
関数エンコード(チャーチ/スコット)と従来エンコード(アセンブラ/ C)のデータ構造のパフォーマンスを比較したいと思います。 しかし、その前に、メモリ内の関数表現がどれほど効率的/であるかを知る必要があります。もちろん、関数は部分的に適用することもできます(別名、クロージャ)。 現在の一般的な関数型言語(Haskell、ML)のエンコードアルゴリズムの使用と、達成可能な最も効率的なアルゴリズムの両方に興味があります。 ボーナスポイント:マップが(ネイティブ整数にエンコードされた整数を機能するようなエンコーディングありshort、intCでなどで)。可能ですか? パフォーマンスに基づいて効率を評価します。言い換えれば、エンコーディングが効率的であるほど、関数型データ構造を使用した計算のパフォーマンスへの影響は少なくなります。

2
型システムでのソート操作の証明
プログラミング言語の型システムがどれほど有益であるかを知りたい。たとえば、依存して型付けされたプログラミング言語でVectorは、ベクトルのサイズを型シグネチャに組み込んだクラスを作成できることを知っています。それは事実上の例のようなものです。appendこれらのシグネチャを使用して関数を記述し、コンパイラが結果のリストのサイズが入力リストの合計になることを証明することもできます。 たとえば、ソートアルゴリズムの型シグネチャをエンコードして、コンパイラが結果のリストが入力リストの順列であることを保証する方法はありますか?可能であれば、これをどのように行うことができますか?

1
組み合わせ論理用語は常に大きいですか?
そのため、ラムダ微積分項をSKコンビネーターを使用して組み合わせロジックに変換するアルゴリズムがあります。サイズが爆発するものを生成します。この爆発的な規模についてもっと知りたいのですが。しかし、私はより良いアルゴリズムを考えることができないようです。関数型言語が実際にコンビネーターにコンパイルされることを聞いたので、より良いアルゴリズムが存在する必要があるようです。私はそのトピックに関するデビッドターナーの論文を調べました、そして彼は基本的にいくつかの最適化を適用するように言って、それらが「かなりの改善」を引き起こすと言います。 「かなりの改善」とは、サイズが多項式の増加のみに低下することを意味しますか?ラムダ項を多項式(またはそれ以下)のみの増加で組み合わせ論理に変換する既知の方法はありますか?そのようなアルゴリズムが存在する場合、それは実用的ですか?

3
関数型プログラミングには不変性が本当に存在しますか?
私は日常生活でプログラマーとして働いており、流行の言語(Python、Java、Cなど)をすべて使用していますが、関数型プログラミングが何であるかについては、まだはっきりとはわかりません。私が読んだことから、関数型言語の1つの特性は、データ構造が不変であることです。私にとってこれだけでも多くの疑問を投げかけます。しかし、最初に、不変性について私が理解していることについて少し書きます。私が間違っている場合は、自由に修正してください。 不変性についての私の理解: プログラムが起動すると、固定データを含む固定データ構造が含まれます これらの構造に新しいデータを追加することはできません コードに変数はありません すでにデータまたは現在計算されているデータから単に「コピー」することができます 上記すべてのため、不変性はプログラムに非常に大きなスペースの複雑さを追加 私の質問: データ構造がそのまま(不変)のままであると想定されている場合、リストに新しいアイテムを追加するにはどうすればよいですか? 新しいデータを取得できないプログラムがあることのポイントは何ですか?プログラムにデータを送りたいセンサーがコンピューターに接続されているとしましょう。これは、受信データをどこにも保存できないことを意味しますか? その場合、関数型プログラミングは機械学習にどのように役立ちますか?機械学習は、プログラムの「知覚」を更新するという仮定から構築されるため、新しいデータを保存します。

2
Haskellリストタイプはどのフィックスポイントですか?
リストが次のように定義されているとしましょう List a = Nil | Cons a (List a) 次に、HaskellでList x最大または最小の固定点は何ですか?lfpは無限リストを除外する必要がありますが(ただし、Haskellで作成できます)、gfpは有限リストを除外する必要があるためです。

2
「純粋な」関数の標準的な定義はありますか?
StackOverflowは私をここに指し示したので、質問は一般人の言葉では少しかもしれません。 ウィキペディアは純粋な関数を次のように定義しています コンピュータプログラミングでは、関数に関するこれらのステートメントが両方とも成立する場合、関数は純粋な関数として記述できます。 関数は常に、同じ引数値が指定された同じ結果値を評価します。関数の結果値は、プログラムの実行が進むにつれて、またはプログラムの異なる実行間で変化する可能性のある非表示の情報や状態に依存したり、I / Oデバイスからの外部入力に依存したりすることはできません。 結果の評価は、変更可能なオブジェクトの変異やI / Oデバイスへの出力など、意味的に観察可能な副作用や出力を引き起こしません。 ただし、出典を引用しているようには見えないため、これが受け入れられた定義であるのか、誰がこのように定義したのかを判断するのは困難です。 「純粋な」関数の構文/注釈が言語に含まれているときの言語の動作を見ると、かなりいくつかの異なるアプローチがあります。 Dでは、唯一の制限はグローバル状態の非変異です。「純粋な」関数はその引数を変更できます。 GCCには、「純粋」の2つのタイプがあります:(pure副作用はありませんが、グローバルな状態を読み取ることができます)およびconst(Wikipediaの定義に従って厳密に純粋です)。 C#では、「目に見える状態の変更を行わない」(それが何であれ)と定義されています。 HaskellはWikipediaの定義に従います。 だから私の質問は、純粋な関数の標準的な定義はありますか? そして、もしあるなら、その源は何ですか?

1
通常順と適用順の評価の違い
私が学んでいる言語はSchemeであり、これを行う演習に取り組んでいます: (define (p) (p) ) (define (test x y) (if (= x 0) 0 y)) 次に、質問は式(test 0(p))を評価し、通常の下で観察されるであろう動作(順序および適用順序の評価)についてコメントを求めます。 これらは私の考えです: 通常の順序では、プログラムは次に進む前に部分式を評価します。 したがって、次のように( test 0 (p) )なります。 (test 0 p) ( if (= x 0) 0 p)) 出力を返す 0 適用順序の唯一の違いは、プログラムが次のように実行されることです。 ( test 0 (p) ) になる: (test 0 (p)) ( if (= x …

1
「マップ挿入ソート」が「マップマージソート」と等しくないのはなぜですか?
中型理論ポッドキャストEP。3、Dan Licataは、すべての入力について、insertionsortとmergesortが同じ結果を与えるという事実は、3番目の関数への引数として高次関数として使用された場合、結果が等しいことを意味しない、つまりmap insertionsort、等しい必要がないと主張しmap mergesortます。 彼はこれを「関数、挿入ソートとマージソートが等しいので、あなたは知らないので」と説明していますが、それでもまだわかりません。 これはなぜですか?反例は素晴らしいでしょう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.