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

6
岡崎以来の純粋に機能的なデータ構造の新機能
Chris Okasakiの1998年の本「純粋に機能的なデータ構造」以来、私はあまりにも多くの新しいエキサイティングな純粋に機能的なデータ構造が登場するのを見ていません。ほんの数例を挙げます。 IntMap(1998年に岡崎によって発明されましたが、その本にはありません) フィンガーツリー(およびモノイドに対する一般化) 「入れ子型」や「一般化代数データ型」を使用してツリーの不変式を確保するなど、既知のデータ構造を実装する興味深い方法もいくつかあります。 この分野で1998年以降に登場した他の新しいアイデアはどれですか?

2
純粋に機能的なデータ構造の未解決の質問は何ですか?
この質問は、1998年に岡崎の本が出版されてからのPFDSの新機能に関する別の質問に触発されたものです。 まず、次の2つの質問から始めます。 ハッシュテーブルの速度に近づく純粋に機能的なセットデータ構造はありますか?試行錯誤はまだありません。 O(1)が追加された純粋に機能的なフィンガーツリーはありますか?これまでのベストは、カプランとタージャンによって考案されたO(lg lg n)です。 他に純粋に機能するデータ構造の問題は何ですか?

2
カテゴリカル用語でのApplicativeファンクターの説明-モノイダルファンクター
Applicativeカテゴリ理論の観点から理解したいと思います。 のドキュメントにApplicativeは、それは強力な緩いモノイダルファンクターであると書かれています。 第一に、モノイドのファンクターに関するウィキペディアのページでは、モノイドのファンクターは緩いか強いのいずれかであると述べています。したがって、ソースのいずれかが間違っているか、用語が異なって使用されているように思えます。誰もそれを説明できますか? 第二に、Applicativeモノイドのファンクターであるモノイドのカテゴリーは何ですか?ファンクターは、標準のHaskellカテゴリー(オブジェクト=タイプ、モーフィズム=関数)の内部ファンクターであると仮定しますが、このカテゴリーのモノイド構造が何であるかはわかりません。 手伝ってくれてありがとう。

8
高次アルゴリズム
よく知られているアルゴリズムのほとんどは、入力と出力が「プレーン」データであるという意味で、1次です。いくつかは、ソート、ハッシュテーブル、またはマップとフォールド関数など、些細な方法で二次的なものです:それらは関数によってパラメーター化されますが、他の入力データの一部でそれを呼び出すことを除いて、それで実際に面白いことは何もしません。 一部は2次ですが、やや興味深いものもあります。 モノイドによってパラメーター化されたフィンガーツリー 単調な述語でフィンガーツリーを分割する 通常はモノイドや述語などによってパラメータ化されたプレフィックス和アルゴリズム。 最後に、私にとって最も興味深い意味で「真に」高次のものもあります。 Yコンビネーター 差分リスト 他の重要な高次アルゴリズムは存在しますか? 私の質問を明確にするために、「非自明な高次」の下で、「アルゴリズムのインターフェースおよび/または実装で重要な方法で計算形式の高次機能を使用する」ことを意味します

1
正規関数を使用したプログラミング言語
すべての関数が標準的な形式を持つ(関数型の)プログラミング言語はありますか?つまり、すべての入力セットに対して同じ値を返す2つの関数はすべて同じ方法で表されます。たとえば、f(x)がx + 1を返し、g(x)がx + 2を返した場合、f(f(x ))およびg(x)は、プログラムのコンパイル時に区別できない実行可能ファイルを生成します。 おそらくもっと重要なのは、プログラムの正規表現に関する詳細情報をどこで/どのように見つけることができるかということです(グーグルの「正規表現プログラム」は実りが少ないです)質問するのは自然な質問のように思えますが、探しているものの適切な用語がわからないのではないかと心配しています。そのような言語をチューリング完全にすることが可能かどうか、そうでなければ、そのような特性を保持しながらプログラミング言語をどれだけ表現できるかについて興味があります。 私の背景はかなり限られているため、前提条件の少ないソースを好むでしょうが、より高度なソースへの参照もクールかもしれません。

2
ラムダ計算と組み合わせロジックは同じですか?
私は現在、ヒンドリーとセルディンの「ラムダ計算と結合子」を読んでいます。私は専門家ではありませんが、関数型プログラミング(LispとSICPから始まり、現在はRとHaskellに関係している)のため、ラムダ計算に常に関心を持っています。 「バイナリラムダ計算と組み合わせロジック」では、John Trompは次のように述べています。 CLは、ラムダ計算のサブセットと見なすことができます。理論はほとんど同じであり、拡張性の規則が存在する場合は同等になります。 どのような条件下で、ラムダ計算の代わりに組み合わせロジックを使用しますか? すべての参考文献をいただければ幸いです。

5
純粋な関数型プログラミング言語用の注釈付きの正式な検証システムはありますか?
ACSL(Ansi C仕様言語)は、特別なコメントが付けられたCコードの仕様であり、Cコードを正式に検証できます。 私はまだ調べていませんが、ACSL検証で使用される正式な方法はHoare Logicに似ていると思います。ただし、Haskellなどの純粋な関数型言語の場合、フォーマル検証にどのようなフォーマリズムが使用されるか想像できません。 ACSLに似たものを作った人はいますか?そうでない場合、関数型言語の仕様注釈付きスタイルのフォーマル検証に関する研究はありますか? 私は、多くの言語(Agda、イドリスなど)がサポートする依存型付けがあることを知っていますが、Haskellでは、いくつかの(判読できない?)型の奇妙なことをせずに、依存型付けは困難です。それを念頭に置いて、HaskellはAgdaやIdrisよりもはるかに優れたライブラリをサポートしているので、機能的な形式検証のためのこのようなシステムが役立つと思いますが、これについて研究が行われたかどうかはわかりません。

1
交差点タイプと共用体タイプの実際的な問題は何ですか?
学習体験として、静的に型付けされた単純な関数型プログラミング言語を設計しています。 私がこれまでに実装した型システムは、(少し余分な作業を行うことで)交差型と共用体型を組み込むことができるようです。 <Union String Integer> <Union Integer Foo> 上記の2つのタイプの共通部分はプレーンです Integer 2つのタイプの結合は次のようになります <Union String Integer Foo> もちろん、これが可能であるという事実は、必ずしもそれが優れたデザインアイデアであることを意味するわけではありません。特に、型をばらばらにしたり、重複を処理したりすることの実装の難しさを少し心配しています。 このような機能を型システムに組み込むことの長所と短所は何ですか?

2
ガベージコレクションされたプログラミング言語で指定された最悪のデータ構造の実行時間を分析するとき、GCのコストを無視できますか?
私は自分の質問への答えが「はい」であると仮定してきたことに気付いたが、正当な理由はない。おそらく、ワーストケースのスローダウンのみを導入するガベージコレクターがあると思います。引用できる決定的なリファレンスはありますか?私の場合、純粋に機能的なデータ構造に取り組んでおり、これらの詳細が重要な場合は標準MLを使用します。O(1)O(1)O(1) そしておそらく、この質問は、たとえばJavaで指定されたデータ構造に適用されると、さらに関連性が高くなるでしょうか?Javaを使用するアルゴリズム/データ構造の教科書に関連する議論があるかもしれません。(SedgewickにはJavaバージョンがあることは知っていますが、Cバージョンにしかアクセスできません。)

2
トータル関数プログラミングの制限は何ですか?
トータル関数型プログラミングの制限は何ですか?チューリング完全ではありませんが、可能なプログラムの大部分のサブセットを引き続きサポートしています。チューリング完全言語で記述できるが、完全な関数型言語では記述できない重要な構成要素はありますか? そして、完全な関数型言語で書かれたプログラムは完全に静的に分析でき、チューリング完全言語の静的分析は停止問題のようなものによって制限されていると言うのは正しいでしょうか?それは、実行時にしかわからないものがあるため、完全に機能的な言語ですべてが静的に決定できるという意味ではありませんが、理論的には、理想的な完全な機能プログラミング言語で書かれたプログラムを分析して、理論的には静的に決定できますが、静的に決定できます。または、静的解析を不完全にする機能言語全体に継承される未決定の問題がまだありますか?一部の問題は、それがどの言語で書かれているかにかかわらず、常に決定できませんが、言語に継承されるこのような問題に興味があります。

2
カテゴリー理論、計算の複雑さ、組み合わせ論的接続?
私は「機能アルゴリズム設計の真珠」を読み、続いて「プログラミングの代数」を読み込もうとしましたが、同じ再帰定義を持ち、その後に導くコンビナトリアル種の紹介に示されているように、同じ形式のべき級数(または関数を生成)に(「種とファンクターと型、Oh My!」を読みました)。 それで、最初の質問について、べき級数から生成(再帰)方程式を回復する方法はありますか?しかし、それは再考です。 私は、「データ構造に関する手順を定義する」一種の初期代数と最終共代数の概念にもっと興味がありました。関数型プログラミングには、合成、代数間のマッピングの生成物などに関する実用的なルールがいくつかあります。これについては、このチュートリアルで例として説明します。これは複雑さにアプローチするための非常に強力な方法である可能性があり、たとえば、そのようなコンテキストでマスターの定理を回復することはかなり簡単に見えます(つまり、同じインスタンスを行う必要があるので、このインスタンスではあまり利益がありません)そして、初期代数からのユニークなカタモルフィズムと、F多項式ファンクターのAとFAの間の代数が同型であるという事実(私は間違っていますか?)は、そのようなアプローチがデータ構造に対する操作。 実用的な観点から見ると、融合ルールのように見えます(基本的に、代数型射を相互に合成する方法、合同型射、一般型型)は、プログラム変換とリファクタリングのための非常に強力な最適化手法です。これらのルールを最大限に活用することで最適なプログラムを作成できると思います(不要な中間データ構造やその他の余分な操作はありません)。 ここに何か(そして何)がありますか?このように計算の複雑さを調べることは(学習の観点から)受益者ですか?「素敵な」初期代数を持つことができる構造は、いくつかの問題に対して何らかの形で制限されすぎていますか? 私は主に、検索空間の構造、および「検索空間」と「検索アルゴリズム」がファンクターの初期代数のような「素敵な」オブジェクトを介して相互作用する方法に関して複雑さを考える方法を見つけようとしています。より複雑な構造を見るときに、物事をこのように見ようとすることが有用かどうかを理解する。

4
命令型言語は、関数型言語よりも互いにどのように異なるのですか?
私はサイモン・ペイトン・ジョーンズの「関数型プログラミング言語の実装」を読んでいますが、私を驚かせた声明が1つあります(39ページ)。 命令型言語の場合よりもはるかに広い範囲で、関数型言語は主に相互の構文上のバリエーションであり、セマンティックの違いは比較的少ないです。 さて、これは1987年に書かれたものであり、この主題に関する私の考えは、当時は普及しておらず人気もなかった、より現代的なプログラミング言語の影響を受ける可能性があります。しかし、これを信じるのは少し難しいと思います。たとえば、記述されているミランダプログラミング言語(Haskellの初期の前身)は、CがPascalに、またはCがsmalltalkにさえ言うよりも、MLのような厳密な言語に比べて、はるかに異なるセマンティクスを持っていると思います(ただし、 C ++は、彼のポイントの検証を提供します:-)。 しかし、もう一度、私はこれを私の直感的な理解に基づいています。サイモン・ペイトン・ジョーンズはこれを言うのに大部分が正しいのでしょうか、またはこれは議論の余地のある点ですか?

3
リーダー、ライターモナド
してみましょうあることCCC。してみましょうの製品bifunctorも。通り猫が CCCである、我々はカレーできる:CCC(×)(×)(\times)CCC(×)(×)(\times) curry(×):C→(C⇒C)curry(×):C→(C⇒C)curry (\times) : C \rightarrow(C \Rightarrow C) curry(×)A=λB.A×Bcurry(×)A=λB.A×Bcurry (\times) A = \lambda B. A \times B ファンクターカテゴリは、通常のモノイダル構造があります。C⇒CC⇒CC \Rightarrow C でモノイド中モナドである。C⇒CC⇒CC \Rightarrow CCCC 有限積をモノイド構造と見なします。CCC curry(×)1≅idcurry(×)1≅idcurry (\times) 1 \cong id ∀A B.curry(×)(A×B)≅(curry(×)A)∘(curry(×)B)∀A B.curry(×)(A×B)≅(curry(×)A)∘(curry(×)B)\forall A\ B. curry (\times) (A\times B) \cong (curry (\times) A) \circ (curry (\times) B) したがって、はモノイド構造を保持するため、モノイドにモノイドを、コモノイドをコモナに輸送します。つまり、任意のモノイドをモナドに転送します(定義を見てくださいはモノイドでなければなりません)。同様に、それは輸送対角線comonoidにCoreaderの comonadを。w (W ...

3
フィンガーツリー構造のブートストラップ
2-3本のフィンガーツリーをかなりの時間使用した後、ほとんどの操作でそのスピードに感銘を受けました。ただし、私が遭遇した1つの問題は、大きなフィンガーツリーの最初の作成に関連する大きなオーバーヘッドです。構築は一連の連結操作として定義されるため、不必要な多数のフィンガーツリー構造を構築することになります。 2本から3本の指の木は複雑であるため、それらをブートストラップするための直感的な方法は見当たらず、すべての検索が空になりました。質問は、2〜3本の指のツリーを最小限のオーバーヘッドでブートストラップする方法です。 明示的に:既知の長さnのシーケンスが与えられると、最小限の操作でSのフィンガーツリー表現を生成します。SSSnnnSSS 素朴な方法は、cons操作(文献では ' '演算子)を連続して呼び出すことです。しかしながら、これは、作成するn個のすべてのスライスを表す異なる指ツリー構造Sのための[ 1 .. I ]を。◃◃\triangleleftnnnSSS[1..i][1..i][1..i]

2
部分的に順序付けられた一連の要素のどの永続データ構造ですか?
タイプaの要素セットを保存する必要があります。タイプaは部分的に順序付けられているため、と比較すると、より小さい、大きい、等しい、または比較できない値が返される可能性があります。a1a1a_1a2a2a_2 ハッシュテーブルの問題の1つは、2つの等しい要素を別々に表現できることです。また、私は、等しいと一致するハッシュ関数にアクセスできません。 2つの要素の比較には時間がかかるため、比較を最小限に抑えることは興味深いでしょう。必要に応じて、比較演算子への呼び出しをメモすることができます。アンチチェーンを保存するだけでよいことを理解しました(または、そうすることを想定しましょう)。より正確には、実行する必要がある操作は次のとおりです。 アンチチェーンから要素を削除します。 要素を追加してみてください。要素がメンバーよりも小さい場合は追加しないでください。そうでない場合は、要素を追加して、それより小さい要素をすべて削除してください。 すべての要素を2つの整数でバインドすることもできます。そのため、およびであることがわかっている場合、知るとすぐにます。もちろん、は意味わけではありません...整数の境界を見つけることは、完全な要素比較に比べて比較的安価な操作です。私1&lt; a &lt; i2私1&lt;a&lt;私2i_1 < a < i_2私3&lt; b &lt; i4私3&lt;b&lt;私4i_3 < b < i_4私2&lt; 私3私2&lt;私3i_2 < i_3a &lt; ba&lt;ba < b私2≮ 私3私2≮私3i_2 \not< i_3≮ Ba≮ba \not < b

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