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

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

4
ラムダ計算で関数が匿名であることが重要なのはなぜですか?
私は、「関数型プログラミングの冒険」というタイトルのジムウェイリッヒによる講義を見ていました。この講義では、高次関数の不動点を本質的に見つけるYコンビネータの概念を紹介します。 彼が述べているように、動機の1つは、ラムダ計算を使用して再帰関数を表現できるようにすることです。これにより、チャーチの理論(ラムダ計算を使用して効果的に計算できるもの)が維持されます。 問題は、ラムダ計算が名前付き関数を許可しないため、関数がそれ自体を単純に呼び出すことができないことです。 n (x 、y)= x + yn(x,y)=x+yn(x, y) = x + y 名前 ' 'を付けることはできません。匿名で定義する必要があります。nnn (x 、y)→ x + y(x,y)→x+y(x, y) \rightarrow x + y ラムダ計算に名前のない関数が重要なのはなぜですか?名前付き関数がある場合、どの原則に違反しますか?それとも、私はジムのビデオを誤解しただけですか?

3
タイプ 'a->' bのML関数
私たちの教授は、型を持つOCamlの関数を考えるように頼みました。 'a -> 'b つまり、何でもかまいませんが、異なるものを返すことができる1つの引数の関数です。 raise引数を無視する関数で使用することを考えました: let f x = raise Exit しかし、教授は、標準ライブラリの機能を必要としないソリューションがあると述べました。私は混乱'bしています。最初に持っていない場合、どうやって作ることができますか? 何が起こっているのかを理解したいので、スタックオーバーフローではなくここで質問しています。説明のないプログラムを見たくありません。

3
言語をホモイコニックにする方法
この記事によると、次のLispコード行は「Hello world」を標準出力に出力します。 (format t "hello, world") ホモイコニック言語であるLispは、次の方法でコードをデータとして扱うことができます。 ここで、次のマクロを作成したと想像してください。 (defmacro backwards (expr) (reverse expr)) backwardsはマクロの名前で、式(リストとして表される)を取り、それを逆にします。もう一度、「Hello、world」で、今回はマクロを使用しています。 (backwards ("hello, world" t format)) Lispコンパイラはそのコード行を見ると、リストの最初のアトム(backwards)を見て、マクロに名前を付けていることに気付きます。未評価のリスト("hello, world" t format)をマクロに渡し、マクロはリストをに再配置します(format t "hello, world")。結果のリストはマクロ式を置き換え、実行時に評価されるものです。Lisp環境は、最初のアトム(format)が関数であることを確認し、評価して残りの引数を渡します。 Lispでは、コードがリスト(s-expressions?)として実装されているため、このタスクを達成するのは簡単です(間違っている場合は修正してください)。 次に、このOCaml(ホモイコニック言語ではない)スニペットを見てください。 let print () = let message = "Hello world" in print_endline message ;; OCamlにホモイコニシティを追加するとします。OCamlはLispと比べてはるかに複雑な構文を使用します。どうしますか?同種性を実現するために、言語は特に簡単な構文を持っている必要がありますか? 編集:このトピックから、Lispのものとは異なるホモイコニック性を達成する別の方法を見つけました:io言語で実装されたもの。この質問に部分的に答えるかもしれません。 ここでは、簡単なブロックから始めましょう。 Io> plus := block(a, b, a …

1
多相ラムダ計算の素朴な集合理論モデルはありませんか?
フリーの定理に関するフィリップワドラーの論文では、パラメトリック性に関するセクション2で次のように述べています。 多相ラムダ計算の素朴な集合論的モデルはない 素朴な集合論的モデルでは、型は集合であり、関数は合理的と思われる集合論的関数です。それでは、なぜ彼は多相ラムダ計算の素朴な集合論的モデルがないと言っているのでしょうか?

3
プログラミング言語理論の勉強
私は最近、(機能的な)プログラミング言語の側面を理解し、証明することに非常に興味を持ちました。 しかし、さらに深く掘り下げていくと、計算、カテゴリー理論、および表示的意味論のようなものは、適切な説明なしに理解するのが少し難しいです。λλ\lambda 私はSICP(非常に啓発的な本)を読みましたが、関数型プログラミングの理論をさらに深く掘り下げたいと思っています。関数型プログラミング言語の理論を一から議論する本/ブログ/サイト/あなたの名前はありますか?

3
関数型プログラミングのために純粋に設計されたCPUはどう違うのでしょうか?
CPUは、人々が暗黙的または明示的に作成するソフトウェアを念頭に置いて設計されています。 命令セットアーキテクチャの設計を見ると、各命令が命令型コマンドをエンコードするという意味で、それらは非常に「命令型」であるように思えます。また、現在の命令セットアーキテクチャは、プログラマが生成するコードのタイプに部分的に基づいて進化しているようにも思えます。 関数型プログラミングスタイルで記述されたプログラムのみを実行することを知って、CPUをゼロから設計する場合、そのCPUは既存のCPUとは異なるようにどのように設計されますか?



2
高階関数は、関数型プログラミングにより強力な機能を提供しますか?
cstheory.SEについても同様の質問をしました。 Stackoverflowのこの回答によれば、非遅延純粋関数型プログラミング言語では複雑さを持つアルゴリズムがありますが、命令型プログラミングの同じアルゴリズムはです。FP言語に遅延を追加すると、アルゴリズムはます。Ω (n logn )Ω(nログ⁡n)\Omega(n \log n)Ω (n )Ω(n)\Omega(n)Ω (n )Ω(n)\Omega(n) 高階関数がある場合とない場合のFP言語を比較する同等の関係はありますか?まだチューリング完了ですか?もしそうなら、FPの高次の欠如は、言語の「強力」または効率を低下させますか?

1
IOモナドは技術的に間違っていますか?
haskell wikiには、IOモナドの条件付き使用の次の例があります(こちらを参照)。 when :: Bool -> IO () -> IO () when condition action world = if condition then action world else ((), world) この例では、の定義はすべてをより理解しやすくするためのものであるIO aことRealWorld -> (a, RealWorld)に注意してください。 このスニペットは、IOモナドで条件付きでアクションを実行します。さて、それconditionがFalseであると仮定すると、アクションactionは決して実行されるべきではありません。遅延セマンティクスを使用すると、これが実際に当てはまります。ただし、ここではHaskellが技術的に厳密ではないことに注意してください。これは、たとえば、コンパイラーがaction world別のスレッドでプリエンプティブに実行することを許可され、後で必要でないことが判明したときにその計算を破棄することを意味します。ただし、その時点までに副作用はすでに発生しています。 さて、プログラム全体が終了したときにのみ副作用が伝播されるようにIOモナドを実装し、どの副作用を実行すべきかを正確に知ることができます。ただし、これはそうではありません。Haskellで無限のプログラムを作成することが可能であるため、明らかに中間の副作用があります。 これは、IOモナドが技術的に間違っていることを意味しますか、またはこれを防ぐ他の何かがありますか?

2
CPUアーキテクチャは手続き型ランタイムに偏っていますか?
Rustのような同時実行時のパフォーマンスを向上させるためにCPUに変更を加えることはできますか?たとえば、同時実行に役立つ分岐予測の実装またはキャッシュサイズに変更はありますか? 現在のCPU設計は、Cのような手続き型ランタイムに対してより最適化されるかもしれないという印象を持っています。 例示のために、手続き予測コードを分析する研究論文に描かれた一般化に基づいて、分岐予測が実装されました。並行性の抽象化により、既存の分岐予測アルゴリズムに悪影響を与える重要なワーキングセットがランタイムに追加されるのではないかと思っています。たとえば、forループでの予測は1つのことですが、ブランチのターゲットが常にメモリの新しい部分(グラフィック、テキストなど)である場合、常にキャッシュミスであり、ブランチはありません。それの歴史-どちらもまだ触れていないからです。 これはおそらく馬鹿げた質問です。なぜなら、コンテンツは常にRAMにあるかもしれませんが、使用されるよりも小さい桁に分岐するからです(キャッシュに読み込まれたら)。手続き型ランタイムのキャッシュおよび分岐予測子に保存されているコンテキストの観察可能な時間境界である必要があります。これは、より並列化された環境で抽象化境界として明示されます。だから私は疑問に思う...これらの境界は観察されましたか?これを分析した研究論文はありますか? CPUアーキテクチャは、同時実行コードよりも手続き型コードに偏っていますか?または、最新のCPUは汎用性が高く、高度な同時実行言語が問題になりませんか?

3
「森林破壊」はプログラムから「木」をどのように削除しますか?
私はどのように森林伐採が消費理解だと思うと同時に、リストを生成し(倍からと展開]機能- ここにコードレビューでこの良い答えを参照)、しかし、私はそれを比較した場合、技術上のWikipediaのエントリ、それは削除する「について話しましたプログラムからの木。 プログラムを構文解析ツリーに解析する方法は理解できます(そうですか?)が、プログラムのある種の単純化(それ?)に森林破壊を使用する意味は何ですか?そして、どのように自分のコードにそれをしますか?

1
関数のメモリ使用量などのプロパティは、依存型付き言語で表現できますか?
全体性や関数の純粋さなどを超えてコードのプロパティについて推論したいとしましょう。メモリの消費や関数のアルゴリズムの複雑さについても気にします。これは、依存するタイピングおよびエフェクトシステムを介して実行できますか?

2
配列に似た不変の(永続的な)データ構造の実装で、高速なインデックス付け、追加、追加、繰り返し
配列に似た永続的なデータ構造(ただし不変)を探しています。これにより、高速なインデックス作成、追加、先頭付加、反復(適切な局所性)操作が可能になります。 Clojureは永続的なVectorを提供しますが、これは高速追加専用です。ScalaのVectorは効果的に一定時間の追加と付加を行いますが、Clojureベクトルと同じデータ構造(ビットマップベクトルトライ)に基づいているため、実装方法を取得できません。いくつかのトリックがないと、高速なプリペンドはできません。 すぐに使用できる実装ではなく、そのようなデータ構造を自分で実装する方法の説明に興味があります。

1
「CPS」アプローチは、SML / NJのパフォーマンスに大きな悪影響を与えました。推論が望ましい
Learning F# へのコメント:関数の概念を学ぶために、他のプログラミング言語を使用してF#に翻訳できる書籍はどれですか。マカリウスは述べた: 「CPS」アプローチは、SML / NJのパフォーマンスに大きな悪影響を与えていることに注意してください。その物理的評価モデルは、ハードウェアに組み込まれているあまりにも多くの仮定に違反しています。Isabelle / HOLのようなSMLの大きなシンボリックアプリケーションを使用する場合、CPSを使用したSML / NJは約5倍になります。従来のスタックのPoly / MLよりも100倍遅い。 誰かがこの理由を説明できますか?(できればいくつかの例で)インピーダンスの不一致はありますか?

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