map
是 FP 最重要 Function,若以不同觀點來思考 map
就會有不同結果:除了本身的 map
外,還可當成 lift
與 compose
使用。
Version
Sanctuary 3.1.0
map
import { map, add } from 'sanctuary'
let data = [1, 2, 3]
map (add (1)) (data) // ?
map :: Functor f => (a -> b) -> f a -> f b
(a -> b) -> f a
:將a -> b
與f a
綁定f b
:回傳新f b
這是最典型的 map
,將一般 function 與 Functor 綁定後,改變 Functor 並會傳新 Functor。
lift
import { Just, map, add } from 'sanctuary'
let data = Just (1)
map (add (1)) (data) // ?
map :: Apply f => (a -> b) -> f a -> f b
(a -> b)
:一般 functionf a -> f b
:回傳接受 Apply 並回傳 Apply 的 function
Apply 也必須實現 Functor,因此 Apply 也可使用 map
。
這也是為什麼 Sanctuary 有提供 lift2
與 lift3
,卻沒有 lift
或 lift1
原因,因為 map
亦可當 lift
使用。
compose
import { compose, map, add, mult } from 'sanctuary'
let data = 1
map (add (1)) (mult (2)) (data) // ?
map :: Functor f => (a -> b) -> f a -> f b
(a -> b)
:一般 functionf a
:data 為 Functor,但因為 function 也是 Functor,f a
可想成x -> a
f b
:回傳新 Functor,相當於x -> a
與a -> b
組合,f b
相當於x -> b
此時 map
相當於 compose
。
Conclusion
- 由於
map
是 curry function,因此類似文言文一樣,標點標在不同地方就有不同意義,除了原本map
外,亦可當成lift
與compose
使用