函式式程式設計(五)

2021-09-16 22:16:32 字數 2543 閱讀 1734

如果你前面都看完了跟到了這裡,我只能說你很棒棒,不過我不得不說,這才剛剛開始。前面我們已經知道如何書寫函式式的程式了,但是我們還沒提到控制流(control flow)、異常處理(error handling)、非同步操作(asynchronous actions)和狀態(state)呢?

容器為函式式程式設計裡普通的變數、物件、函式提供了一層極其強大的外衣,賦予了它們一些很驚豔的特性

按照我們的慣例,先從最簡單的容器入手。

var container = function(x) 

container.of = function(x) ;

試著執行以下container.of(3),看看輸出的值。

jquery $(...) 返回的物件並不是乙個原生的 dom 物件,而是對於原生物件的一種封裝,某種意義上就是乙個「容器」。

我們接著新增乙個map方法

container.prototype.map = function(f)

container.of(3)

.map(x => x + 1) //=> container(4)

.map(x => 'result is ' + x); //=> container('result is 4')

這個跟前面我們提到的陣列操作的map方法非常類似,陣列的map方法返回乙個新的陣列,container的map方法返回乙個新的container。

上面的這個具有map方法的容器就是我們接下來要引出來的函子。

functor(函子)是實現了 map 並遵守一些特定規則的容器型別。

functor 是乙個對於函式呼叫的抽象,我們賦予容器自己去呼叫函式的能力。當 map 乙個函式時,我們讓容器自己來執行這個函式,這樣容器就可以自由地選擇何時何地如何操作這個函式,以致於擁有惰性求值、錯誤處理、非同步呼叫等等非常牛掰的特性

接著我們看看牛掰的functor能為我們做什麼

var maybe = function(x) 

maybe.of = function(x)

maybe.prototype.isnothing = function()

maybe.prototype.map = function(f)

maybe.of("malkovich malkovich").map(match(/a/ig));

//=> maybe(['a', 'a'])

maybe.of(null).map(match(/a/ig));

//=> maybe(null),**並沒有報錯,我們在對函式呼叫時,檢查了函式是否為空

我們如果不想一值.map .map, 可以用柯里化函式對上面的**稍微改進一下

var map = curry((f, any_functor_at_all) => any_functor_at_all.map(f));
錯誤處理

var left = function(x) 

var right = function(x)

left.of = function(x)

right.of = function(x)

left.prototype.map = function(f)

right.prototype.map = function(f)

var getage = user => user.age ? right.of(user.age) : left.of("error!");

getage().map(age => 'age is ' + age);

getage().map(age => 'age is ' + age);

//left 會終端機鏈式呼叫

最後來看下我們不得不做的io操作

let readlocalstorage = () =>
機智的改造成純函式

let readlocalstorage = () => ;

}

然而並沒有什麼軟用

var io = function(f) 

io.of = function(x)

io.prototype.map = function(f)

var io_window = new io(function());

io_window.map(function(win));

io_window.map(_.prop('location')).map(_.prop('href')).map(split('/'));

var $ = function(selector) );

}$('#mydiv').map(head).map(function(div));

函式式程式設計(五) 裝飾器

假設我們要增強now 函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now 函式的定義,這種在 執行期間動態增加功能的方式,稱之為 裝飾器 decorator 即為已經存在的物件新增額外的功能 為了減少重複寫 裝飾器的需求場景 插入日誌 效能測試 事務處理 快取 許可權校驗等。一 函式...

Phthon學習筆記(五) 函式式程式設計

functional 一種程式設計正規化。1.把計算視為函式而非指令 2.純函式式程式設計 不需要變數,沒有變數,測試簡單 3.支援高階函式,簡潔 1.不是純函式式程式設計 允許有變數 2.支援高階函式 函式也可以作為變數傳入 3.支援閉包 有了閉包 就能返回函式 4.有限度的支援匿名函式 1.變數...

python總結(五) 函式式程式設計plus

1.高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回。def lazy sum args def sum ax 0 for n in args ax ax n return ax return sum f lazy sum 1,3,5,7,9 f 注意到返回的函式在其定義內部引用了區域...