尾遞迴解決的是棧的記憶成本,更好防止堆疊溢位。
遞迴在兩種情況下會掛:一是沒有結束條件;二是堆疊記憶體超過了最大限制。
1、柯里化
柯里化是一種「預載入」函式的方法,通過傳遞較少的引數,得到乙個已經記住了這些引數的新函式,某種意義上講,這是一種對引數的「快取」,是一種非常高效的編寫函式的方法。
2、高階函式
函式當引數,把傳入的函式做乙個封裝,然後返回這個封裝函式,達到更高程度的抽象。
3、尾呼叫優化
指函式內部的最後乙個動作是函式呼叫。該呼叫的返回值,直接返回給函式。
函式呼叫自身,成為遞迴。如果尾呼叫自身,就稱為尾遞迴。
遞迴需要儲存大量的呼叫記錄,很容易發生棧溢位錯誤,如果使用尾遞迴優化,將遞迴變為迴圈,那麼只需要儲存乙個呼叫記錄,這樣就不會發生棧溢位錯誤了。
4、範疇與容器
函子(functor): 用於將乙個範疇轉成另乙個範疇。
函子是函式式程式設計裡最重要的資料型別,也是基本的運算單位和功能單位。它首先是一種範疇,也就是說,是乙個容器,包含了值和變形關係。比較特殊的是,它的變形關係可以依次作用於每乙個值,將當前容器變形成另乙個容器。
任何具有 map 方法的資料結構,都可以當作函子的實現。
函式式程式設計一般約定,函子有乙個 of 方法,用來生成新的容器。函子的標誌就是容器具有 map 方法。該方法將容器裡面的每乙個值,對映到另乙個容器。
5、either 函子
內部有兩個值:左值和右值。右值是正常情況下使用的值,左值是右值不存在時使用的預設值。
left 和 right 唯一的區別就在於 map 方法的實現,right.map的行為和我們之前提到的map函式一樣。但是left.map就很不同了:它不會對容器做任何事情,只是很簡單地把這個容器拿進來又扔出去。這個特性意味著,left 可以用來傳遞乙個錯誤訊息。
6、ap函子
函子裡面包含的值,完全可能是函式。我們可以想象這樣一種情況,乙個函子的值是數值,另乙個函子的值是函式。
class ap extends functor
}
注意,ap
方法的引數不是函式,而是另乙個函子。
7、monad
monad是一種設計模式,表示將乙個運算過程,通過函式拆解成互相連線的多個步驟。你只要提供下一步運算所需的函式,整合運算就會自動進行下去。
promise 就是一種 monad 。
monad 讓我們避開了巢狀地獄,可以輕鬆地進行深度巢狀的函式式程式設計,比如 io和其它非同步任務
阮一峰 函式式程式設計入門教程
函式式程式設計總結
函式式程式設計是圍繞高階函式進行的,設計的核心在於高階函式的設計。1 函式式程式設計通過函式的復合生成更大的結構 2 函式的操作分為分解和復合 分解即為柯里化,可以分為偏函式分解和徹底分解。復合即為待定係數和呼叫約定。3 函式的運算最終轉化為代數運算。4 monad的本質是簡化版的物件,與閉包類似 ...
資源總結 函式式程式設計
首推coursera上的programming languages,公認的神課了 雖然我cs的朋友聽了一半覺得太簡單沒聽下去但是感覺對我幫助還蠻大的 不過作業量也真是大233 不單單講函式式程式設計,我覺得重點是對語言的特性能有進一步的了解 此外按習慣會在hankerrank刷刷題 haskell的...
函式式程式設計中常用的函式(總結)
1.函式式程式設計的含義 函式式程式設計是一種程式設計的基本風格,就是構建程式的結構和元素的方式。函式式程式設計將計算過程看做是數學函式,也就是可以使用表示式程式設計。在函式的 中,函式的返回值只以來傳入函式的引數,因此使用相同的引數呼叫2次就會得到相同的結果。如果說這段話很難理解,我覺得可以這麼想...