4

私はで関数型プログラミングを学んでいます。Clojureという機能的なパラダイムの理論的理解を深めたいと思っています(Clojureの構文だけでなく)。機能プログラミングの公理

私は 公理または 再帰のような どのように各機能技術、マップ、減らす、短所、最初のANS残りがいるから/構成可能な誘導可能され、相互に関連し、ある探してい

すべての背後にある究極の公理。

例えば、私はmapのみrecurfirstrestcons機能を使用して実装することができ実現され、当然マッピング関数自体はmapに渡されます。

はその後、私はまた、mapreduceを使用して実装し、再びrecurfirstrestを使用して実装することができ軽減することができ実現しました。また、filterreduceで実装できます。

任意の関数を構成する抽象化またはキーワードの最小セットであるすなわち、私は関数型プログラミングのまわりで私の頭をラップするために開始するように私は感じるが、ほとんどの究極のビルディングブロックされているかを確認することはまだ難しいです。マップの例では、2番目の方法では、抽象化を使用して同じ目標を達成しています。だから、私が大きな絵を見るのを助ける機能的なパラダイムのいくつかの究極の公理は何ですか?

+1

この場合、この本をチェックすることをお勧めします:https://mitpress.mit.edu/books/little-schemer FPへの素晴らしいイントロです。基本的な番号だけを使って物事を作る方法を示しています要素のまた、古典的な[SICP](https://mitpress.mit.edu/sicp/full-text/book/book.html)は大いに助けることができます。どちらもlisp(正確にはスキーム)を採用しているので、理解をClojureに移すのは簡単です – leetwinski

+0

関数型プログラミングはLamda Calculusに大部分根をおいており、コアの公理は以下のamalloy状態です。 –

+0

'map'も' for'と置き換えることができることを忘れないでください。 –

答えて

5

ラムダ(クロージャーではfnと呼ばれています)からは、他のものを派生させることができます。たとえば、のは、fnconsfirst、およびrestを導出する古典的な運動をしましょう:究極の公理ラムダ:あなたは関数型プログラミングのための公理のセットをしたい場合

(defn cons [x y] 
    (fn [f] 
    (f x y))) 

(defn first [coll] 
    (coll (fn [x y] x))) 

(defn rest [coll] 
    (coll (fn [x y] y))) 

ので、一つだけあります。他の機能の導出方法については、

  • 古典的なLambda the Ultimateの論文を参照してください。より最近のアプローチである
  • Programming with Nothingです。これはRubyの構文を使用していますが、使用する唯一の言語機能はラムダであるため、実際には問題ありません。
  • SICPには、抽象化障壁の価値を説明する一部としてcar/cdr/consをラムダから導出するセクションもあります。実装は、確立した契約を満たす限り重要ではありません。もちろん、一般的なプログラミングの基礎に興味があるなら、SICPは一般的には良い読書です。

この回答についての多くの混乱があるようですが、コメントからと思われます。これまで見たことのない人たちのために説明していない私のせいです。

考えられるのは、あらゆる種類のシーケンスで機能する高度な多型であるclojureの組み込みfirst/rest機能のすべてを再実装することではありません。むしろ、我々は

(= x (first (cons x y))) 
(= y (rest (cons x y))) 

あなたちょうどラムダとのClojureの実際の最初の/残りのような、より複雑なものを構築することができるという契約を満たすことで、3つの短所/あなたがコレクションを構築することを可能にするために一緒に働く最初/休憩機能を実装しますしかし、あなたは全体の型システムを最初に考案しなければならないので、それはもっと複雑です。

は、ここでは、この演習では、証明するために意図したもので記述した例のREPLセッションです:

(defn cons [x y] 
    (fn [f] 
    (f x y))) 

(defn first [coll] 
    (coll (fn [x y] x))) 

(defn rest [coll] 
    (coll (fn [x y] y))) 
user> (def integers (cons 0 (cons 1 (cons 2 (cons 3 nil))))) 
#'user/integers 
user> integers 
#object[user$cons$fn__2108 0x3fb178bd "[email protected]"] 
user> (first integers) 
0 
user> (first (rest (rest integers))) 
2 
+0

これは有望そうですが、私はclojureのドキュメントを読んでも分かりません。これらの書籍でこの「古典的な例」が説明されていますか?コレクションを関数としてどのように使用できますか?私はclojure REPLでこれを試し、 'IllegalArgumentException Keyは整数でなければならない 'というエラーを受け取りました。 –

+0

私はここでも何が起こっているのか混乱しています。関数を使ってコレクションのインデックスを作成しています。 – Carcigenicate

+0

私の編集したものは改善しましたか?最初と残りは間違っていませんでした。むしろ、意図された使用は明らかにはっきりしていなかった。 – amalloy

1

スタートリストは意味、ほとんどの関数型言語でconstructedがどのように理解し、なぜそれがリストを見てとても理にかなっていますfirstrestとなります。この再帰的定義は、それらを変更する再帰的メカニズムを理解する上で重要です。

私は最初にマップ/フィルター/折りたたみなどの方法は実際には、実際には、物事の種類を表現する利点を持っていた。これは、少なくとも私のために、初心者にとっては非常に意味がありました。例えば

mapはとして読ま署名(a -> b) -> [a] -> [b]を持っている:あなたはタイプaを取り、タイプbにそれを回す機能を持っている、とあなたがタイプaのリストを与える場合は、マップは、単にあなたのリストを返しますタイプbと入力します。

1あなたが本当に理解してあなたの時間を取る必要がreduceが入力された世界での特殊なケースとなっているfoldleftright両方)、です。準備が整い次第、私は良い古いことをお勧めします。A tutorial on the universality and expressiveness of fold

あなたが述べたすべてのことを試して実行することを強くお勧めします。これらの基本的なビルディングブロックとその依存関係については、削減実装(および両方のひだ)recurの面では、recurの面でのなどmapfiltertakeの両方を実装reduceなど私はあなたが確率のものに類似の公理の簡単なセットを見つけることができるとは思わない

+0

良い練習問題ですが、 'foldr'はClojureの方がハスケルよりもあまり有用ではありません。なぜなら私たちは永続的な怠惰がないからです。それを自分で実装し、実際には大きなコレクションで使用してみてください。 'または:: [Bool] - > Bool;または= foldr(||)False'は、短絡のため大きなコレクションではうまくいきますが、Clojureのバージョンはうまくいきません。 – amalloy

+0

あなたにはまったく同意する@amalloy。私はそれが折り目が何であるか、そしてそれを学び始めたばかりの人にとっての違いは何かを理解するのは良い練習だと思う。 – Shlomi

1

例えば、理論。

  • P [A]> = 0
  • P [ "任意のイベントは"] 1
  • P [A又はB] = P =すべてのイベントのために:確率のために、わずか3基本的な公理があります[A] + P [B] & Bは

相互に排他的である場合、すべてが確率で&統計はこれらの3つの基本的な仮定から導出することができるということは非常に驚くべきことです。

機能プログラミング」はそれほど明確に定義されていません。事実、ほぼ100%の専門家に関数プログラミングを定義するよう依頼した場合、相互に互換性のない100件の回答が返ってくるという観測から、ほぼすべての本は始まります。この声明は部分的には冗談に過ぎない。

実際に関数型プログラミングについて唯一言えるのは、伝統的な機能以外の機能を強調している点です。これは、実際には、イエス/ノーの観察ではなく、機能的な言語や機能的なプログラミングスタイルの「目標」のほうがはるかに多いです。

関数型プログラミングの目標は、いつもと同じです。より単純でコストの節約&信頼性。もちろん、コンピューティングの開始以来、すべての言語&技術は、この同じゲームプランを持っていました。それは&「増加」を「減らす」と言うこと

注意、ない「だけをループする代わりに、手動で変更可能な変数の使用

  • 増加の使用機能を削減

    • :FPは、主によってそれを達成することを目指して"&" never "。それが何を意味するのかを判断することを決定すると、手元の問題とあなたが求める人によって答えが変わります。

      両方の問題&人が時間とともに変化することに注意してください。コスト、複雑さ、効率性、保守性などの間の今日の「最良の」トレードオフである答えは、問題、人、ツール、ハードウェア、価格などが変化するにつれて、おそらく1年または1年で「最良の」答えにはなりません時間とともに。

      Scientific Principalを覚えておいてください。それはあなたのこと(実験)を試してみるだけではなく、それらについて考える(理論)ように強制します。実際に何かをして結果を観察しなければなりません。

      ソフトウェアでは、これは2つ(またはそれ以上)の方法で問題を解決し、それぞれの手法のマイナスプラス&を比較することを意味します。

  • 関連する問題