如何開始函式程式設計的學習?

banq發表於2018-10-05
如果你習慣命令式語言(OOP),那麼FP所有那些宣告性程式碼片段可能會嚇到你。確實,函式語言背後確實有很多複雜而美麗的數學。么半群,仿函式,單子等等,但是你真的必須首先了解所有這些概念後才能開始函式程式設計嗎?

首先從第一個差異宣告正規化開始,宣告式程式設計的重點是應該做什麼事,而不是如何去做(後者是指令式程式設計)。命令式語言往往集中在一個程式的方法,明確如何實現具體操作及改變程式的狀態,而宣告式程式設計表達操作的邏輯(不要著眼於實現)。

def doubleAll(arr):
  doubles = []
  for elem in arr:
    doubles.append(elem*2)
  return doubles

def doubleAll(arr):
  return map(lambda elem: elem * 2, arr)
<p class="indent">


當我們談論函數語言程式設計時,這可能是最流行的例子之一。在第一個doubleAll函式中,我們確切地告訴計算機應該如何做,我們將每個數字的兩倍追加到一個新陣列中,但之後我們也可以執行另一個操作(例如,遞增一些計數器,將其列印到控制檯)。我們明確告訴機器如何做到這一點。關於第二個函式,我們不關心實施; 相反,我們專注於應該做什麼,透過一個匿名函式map(該函式應用於一個陣列,能建立一個新的陣列,這個函式完全處理如何實現細節)。

其次,我會說人們應該理解不變性。這是使函數語言程式設計與其他範例有很大不同的事情之一。

函式應被視為資料,這意味著您可以返回函式或將它們作為引數傳遞,甚至可以組合以獲得所需的結果。因為它們是資料,所以它們也應該是純粹的 ; 這意味著如果你有一個名為is-number它的函式,從字面上看,檢查它是否是一個數字。不要試圖隱瞞任何其他責任(例如列印到控制檯,將一些記錄新增到資料庫):它必須按照它說的做。

如果要檢查它是否為數字,然後將其提交到資料庫(或任何其他日誌記錄材料),請建立另一個函式來訪問資料庫。然後,您可以將兩者組合成所需的輸出。當然會產生第三個,不合格 函式(資料庫被認為是I / O,而且這個新函式不純),但是,現在你有兩個獨立的函式,因此提高了程式碼的可維護性(和方便除錯!)。

原文

相關文章