iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 4
3
Software Development

Functional Programming in JS系列 第 4

Do Everything with Function

在介紹下一個 Buzz Word 之前,要先來介紹 FP 中最重要的主角 - Function

FP 的核心思想就是透過 function 來解決各種問題!與其去想物件要怎麼變來變去、記憶現在變數到底是什麼、小心翼翼按照順序走(像昨天說的 imperative style,順序不對就會出錯),不如只專注在 function!

One input, One Output

不管輸入幾次同樣值,function 回傳結果永遠相同

你可能會想說 Function 有什麼難的,不是天天都在寫嗎?
但 FP 的 function 其實跟我們一般程式所講的 Function 有點不同,並不是語法上差異而是被規範後的 function(接近數學上的函式),就像我在 為什麼要學 Functional Programming? 所說的是一種撰寫風格跟抽象式思維

整體而言的規範大概就是

  • Function 必須為 First-class citizen,而 js 的 function 本來就有這個特性
  • Function 要是 Pure,不能有 Side Effect
  • Function 是 (數學) 運算式的組合 (expression) 並單純返回值,而不是塞進大量運算與 statement
  • Data 要是 Immutable
  • 不依賴任何外部的狀態 stateless
  • 避免 iterate,也就是 forwhile ...等

這張圖藍色的 Buzz Words 也就是 FP Function 要有的特性,之後篇幅會繼續詳細介紹
https://ithelp.ithome.com.tw/upload/images/20200904/20106426fYC3VO7Y4Y.jpg

Set theoretically

抽象一點的來看 function,其實就是

Every function is a single-valued collection of pairs

https://ithelp.ithome.com.tw/upload/images/20200904/20106426d5UvSONmWY.jpg
{ 1, 2, 3 } 的集合透過 function f 變成了 { A, B, C },不管執行幾次,回傳永遠不會變

f(1); // 'A'
f(2); // 'B'
f(3); // 'C'

而下面這個就不符合 FP 原則
https://ithelp.ithome.com.tw/upload/images/20200904/201064263QIB3ry84T.jpg

f(1); // 'A'
f(2); // 'B'
f(2); // 'C'

把同樣的值 2 傳入 function 有時候回傳 B 有時候是 C ,你不會知道這次到底傳回什麼。

若是不同的值得到一樣的輸出呢?
https://ithelp.ithome.com.tw/upload/images/20200904/20106426Zz5YZOnAnz.jpg
這樣是符合 Functional Programming 的規範的

Given the same inputs, always returns the same output (One input, One output)

只要確保傳入的參數永遠是一樣的輸出就好了

在 js 中還有哪些常見的 one input, one output 呢?

像 js 中的 Object 跟 Array ,還有 es6 裡的 set 、map 都是 one input, one output 的例子喔

const toLowerCase = {'A':'a', 'B': 'b', 'C': 'c'};
toLowerCase['C']; // c'

const name = ['Alice', 'Bob', 'Cindy']
 
name[1] // 'Bob'

補充

很久以前看過這個影片,覺得是一部非常適合入門 FP 的影片,很推薦大家看看

如有錯誤或需要改進的地方,拜託跟我說。
我會以最快速度修改,感謝您

上一篇
Buzz Word 1 : Declarative vs. Imperative
下一篇
Buzz word 2 : Side Effect
系列文
Functional Programming in JS30

2 則留言

6
良葛格
iT邦新手 3 級 ‧ 2020-09-04 08:10:11

「Function 中大多是由 Expression 組合」…

應該說… FP 的構想源自於 lambda 演算,而 lambda 演算中的函式就真的是數學上的函式(也就是你文中談的,相同的一組輸入,結果都是相同,這就是 referential transparency,中文比較怪,常翻成引用通透性),也就是都是運算式(expression),因此這句話建議可以改為「「Function 就是(數學)運算式的組合」。

hannahpun iT邦新手 5 級 ‧ 2020-09-04 12:28:56 檢舉

已更新,感謝建議~

0
kekeke
iT邦新手 5 級 ‧ 2020-09-04 08:39:00

Every function is a single-valued collection of pairs
想請問觀念是輸入對輸出只能一對一與多對一嗎?

hannahpun iT邦新手 5 級 ‧ 2020-09-04 12:31:00 檢舉

重點其實就是 One input, one output 傳入的參數永遠是一樣的輸出
假如以數學集合角度的確是一對一與多對一

我要留言

立即登入留言