4

我正在學習函數式編程Clojure,並希望加深我對函數範式(而不僅僅是Clojure的語法)的理論理解。函數式編程公理

我想找公理公式遞歸,圖中的每個功能的技術如何,減少,利弊,第一ANS其餘涉及對方,這是衍生/從該組合的,並且其一切背後的終極公理。

例如,我意識到map只能使用recurfirstrestcons功能,當然映射函數本身傳遞給map來實現。

在那之後,我也意識到map可以使用reduce也實現,並再次減少可使用recurfirstrest實施。 filter也可以用reduce來實現。

我覺得我開始換我周圍的函數式編程的頭,但它仍然是很難看到,這是最極致的建築塊,即這是最低組的抽象關鍵字組成任意的功能。在地圖示例中,第二種方法使用一個較少的抽象來定位相同的目標。那麼,功能範式的一些最終公理是如何幫助我看到大局的?

+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微積分,核心公理如下面的amalloy所述。 –

+0

不要忘了,'map'也可以替換爲'for' –

回答

5

從lambda(clojure中名爲fn),您可以派生任何其他東西。例如,讓我們做了經典的運動派生consfirstrestfn

(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語法,但它並不重要,因爲它使用的唯一語言功能是lambda。
  • SICP也有一個關於從lambda派生car/cdr/cons的章節,作爲解釋抽象障礙價值的一部分:只要滿足您所建立的合約,實現並不重要。當然,如果你對一般編程的基礎感興趣,那麼SICP就是一個很好的閱讀。

它從註釋中好像有很多關於這個答案的困惑;我的錯是因爲沒有爲以前沒見過的人解釋過。

這個想法並不是重新實現所有clojure的內置第一個/休息功能,這是先進的多態的東西,適用於各種序列。相反,我們實現三個缺點一起工作,讓你建立的集合,通過滿足合同/首/休息函數

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

可以構建更復雜的東西像Clojure的實際第一/休息只有拉姆達,但你必須首先發明一個完整的類型系統,所以它涉及更多。

這裏的描述一下這個演習意在展示一個例子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 must be integer'。 –

+0

我也對這裏發生的事情感到困惑。您正在使用函數爲集合編制索引。 – Carcigenicate

+0

我的編輯改進了一些東西嗎?先休息一下,沒有錯;相反,預期用途顯然不明確。 – amalloy

1

開始通過了解清單是如何在最實用的語言,意思constructed,爲什麼讓這麼多的意義看清單如firstrest。這個遞歸定義是理解你改變它們的遞歸機制的關鍵。

我首先通過haskell實現了映射/過濾/摺疊等方式,它具有表達事物類型的好處。這對初學者來說很有意義,至少對我來說是這樣。

例如,map有讀作簽名(a -> b) -> [a] -> [b]:如果你有一個函數,它接受一個類型a,並把它變成一個類型b,你給a類型的列表,然後地圖只會返回您的列表鍵入b

你應該把你的時間在瞭解一個是fold(包括leftright),其中reduce是在一個類型的世界的一個特例。一旦你感覺準備好了,我會建議你重新考慮一下你所提到的一切,你對這些基本構建模塊和它們的依賴關係的理解會得到很大的改善。實現減少(兩者倍)在recur方面,實施mapfiltertake等在國內外的recur方面reduce

+0

好的練習,但是'foldr'在Clojure中比在Haskell中有用得多,因爲我們缺乏持久的懶惰。嘗試自己實現它,然後在大型集合上實際使用它。 '或:: [Bool] - > Bool;或= foldr(||)由於短路,False對於大集合非常適用,但Clojure中的版本並不好。 – amalloy

+0

絕對同意你@amalloy。我認爲這是一個很好的練習,可以幫助你理解摺疊是什麼以及剛開始學習它們的人有何不同。 – Shlomi

1

我不認爲你可以找到一組簡單的公理類似於概率理論,例如。對於概率,僅存在3個基本公理:

  • P [A]> = 0對於每個事件A
  • P [ 「任何事件」] = 1
  • P [A或B] = P [A] + P [B]如果A & B是相互排斥的

這是很令人驚訝的是一切都在概率統計&可以從這三個基本假設得出。

函數式編程」的定義不太明確。事實上,幾乎所有關於此主題的書都以觀察結果開始,如果您要求100位「專家」定義函數式編程,您將收到100個互不相容的答案。這種說法只是部分地開玩笑。

關於函數式編程,唯一可以說的是它比傳統或「非功能性」語言更強調功能。對於功能語言或函數式編程風格而言,這實際上更像是一個「目標」,而不是「是/否」觀察。

函數式編程的目標與往常一樣:通過更簡單的可靠性實現成本節省&。當然,自計算開始以來,每種語言技術都有相同的遊戲計劃。 FP的目的主要是實現它:

  • 減少使用可變變量的
  • 增加使用功能,而不是手動循環

注意,它說:「減少」 &「增加」,而不是「只有「&」從不「。決定這意味着什麼是一個判斷呼叫,答案會根據手頭和你問的人的問題而改變。

請記住,這兩個問題&人隨時間變化。如今,在成本,複雜性,效率,可維護性等方面進行「最佳」平衡的答案在問題,人員,工具,硬件,價格等變化時可能不是一個月或一年中的「最佳」答案隨着時間的推移。

記住科學校長。它迫使你嘗試一些事情(實驗),而不是隻考慮它們(理論)。所以你必須做一些事情並觀察結果。

在軟件中,這意味着以兩種(或更多)方式解決問題,並比較每種方法的優勢缺點&。