點燈坊

失くすものさえない今が強くなるチャンスよ

map 的三種觀點

Sam Xiao's Avatar 2021-07-28

map 是 FP 最重要 Function,若以不同觀點來思考 map 就會有不同結果:除了本身的 map 外,還可當成 liftcompose 使用。

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 -> bf a 綁定
  • f b:回傳新 f b

這是最典型的 map,將一般 function 與 Functor 綁定後,改變 Functor 並會傳新 Functor。

map000

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):一般 function
  • f a -> f b:回傳接受 Apply 並回傳 Apply 的 function

Apply 也必須實現 Functor,因此 Apply 也可使用 map

這也是為什麼 Sanctuary 有提供 lift2lift3,卻沒有 liftlift1 原因,因為 map 亦可當 lift 使用。

map001

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):一般 function
  • f a:data 為 Functor,但因為 function 也是 Functor,f a 可想成 x -> a
  • f b:回傳新 Functor,相當於 x -> aa -> b 組合,f b 相當於 x -> b

此時 map 相當於 compose

map002

Conclusion

  • 由於 map 是 curry function,因此類似文言文一樣,標點標在不同地方就有不同意義,除了原本 map 外,亦可當成 liftcompose 使用

Reference

F# for Fun and Profit, The map function