目前流行的範式,大約就是:
而其中函數式程式設計的要求,就是將所有 feature 以功能的方式區分,切到最小單位的函式。
而目前流行的 serverless 後端解決方案,恰巧就是以函式做為一個設計,想將函數式程式設計寫的更好的開發者,所不能錯過的一本好書。
數理邏輯學家 Haskell Curry40 提出了一個悖論:
如果這句話是對的,那麼中國與德國是鄰國。
那麼這句話到底是不是對的呢?如果這句話是對的,那麼結果就是"中國 與德國是鄰國" 但是這句話本身也是這句話的條件,如果要表示成程式,會是怎樣的呢?
我們先來翻譯"如果……是對的,那麼中國與德國是鄰國,似乎要稍微簡單一些,看樣子一個函數就能輕鬆搞定:
(someStatement)=>{
if(isTrue)(someStatement)) {
console.log("中國與德國是鄰國")
return true
}
}
要是沒有異議,那麼完整的"如果這句話是對的,那麼中國與德國是鄰
國、"就變成了:
((someStatement)=>{
if(isTrue)(someStatement)) {
console.log("中國與德國是鄰國")
return true
}
})((someStatement)=>{
if(isTrue)(someStatement)) {
console.log("中國與德國是鄰國")
return true
}
})
如果你執行一下這段程式,一定會顯示出錯,因為還沒有實現 isTrue函
數。所以,現在的問題是,如何判斷句子是對的呢?當然是只要這個函數
能傳回 true 就說明它是正確的,而且成功地得出"中國與德國是鄰國"的
結論。
let isTrue (statement)=>statement(statement)
代入前面的程式中就獲得了:
((someStatement)=>{
if(isTrue)(someStatement)) {
console.log("中國與德國是鄰國")
return true
}
})((someStatement)=>{
if(isTrue)(someStatement)) {
console.log("中國與德國是鄰國")
return true
}
})
如果這個函數執行完傳回true,那麼我們就能說"中國與德國是鄰國
了。
但是,執行結果卻是:
RangeError: Maximum call stack size exceeded
現實是殘酷的,讓我們回過頭來看看到底是哪裡出現了問題,導致我們
不到答案。
我們一起來手動執行一下這段程式,首先把參數代入函數中,會獲得:
if(((someStatement)=>{
if(isTrue)(someStatement)) {
console.log("中國與德國是鄰國")
return true
}
})((someStatement)=>{
if(isTrue)(someStatement)) {
console.log("中國與德國是鄰國")
return true
}
})){
console.log("中國與德國是鄰國")
return true
}
按照應用序,我們可以先忽略if敘述,因為if的條件會先被求值:
((statement)=>statement(statement))((statement)=>statement (statement))
⭐⭐⭐⭐
程式撰寫能力
中階以上
本書有一定難度,沒有寫個 JS 兩年以上,可能難以理解作者所述。