Swift函數式編程十三(函子、適用函子、單子)

解釋一些函數式編程中的專用術語和一些常⻅模式,比如函子 (Functor)、適用函子 (Applicative Functor) 和單子 (Monad) 等。理解這些常⻅的模式,會有助於設計自己 的數據類型,併爲 API 選擇更合適的函數。

函子

目前已經遇到了幾個被命名爲 map 的方法,類型分別如下:

extension Array {
func map<R>(transform: (Element) -> R) -> [R]
}
extension Optional {
func map<R>(transform: (Wrapped) -> R) -> R? }
extension Parser {
func map<T>(_ transform: @escaping (Result) -> T) -> Parser<T>
}

每個 map 方法都需要兩個參數:一個即將被映射的數據結構,和一個類型爲 (T) -> U 的函數 transform。對於數組或可選值參數中所有類型爲 T 的值,map 方法會使用 transform 將它們轉換爲 U。這種支持 map 運算的類型構造體 —— 比如可選值或數組 —— 有時候也被稱作函子 (Functor)。

函子也會被描述爲一個儲存特定類型值的 “容器”。而 map 方法則用來對儲存在容器中的值進行轉換。

適用函子

除了 map ,許多函子還支持其它的運算。

對於任意的類型構造體,如果可以爲其 定義恰當的 pure 與 <*> 運算,就可以將其稱之爲一個適用函子 (Applicative Functor)。或 者再嚴謹一些,對任意一個函子 F,如果能支持以下運算,該函子就是一個適用函子:

func pure<A>(_ value: A) -> F<A>
func <*><A, B>(f: F<A -> B>, x: F<A>) -> F<B>

單子

如果一個類型構造體 F 定義了下面兩個函數,它就是一個單子 (Monad):

func pure<A>(_ value: A) -> F<A>
func flatMap<A, B>(_ f: (A) -> F<B>) -> F<B>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章