點燈坊

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

深入淺出 Functor Laws

Sam Xiao's Avatar 2021-07-17

Functor 遵循 2 個 Functor Laws,專門描述 map 的 2 個特性。

Version

Haskell for Mac 1.8.2

Identity Law

f = map id
g = id

f [1, 2, 3]
g [1, 2, 3]
  • 使用 map 將 Functor 與 id 綁定
  • 使用 id 將 Functor 綁定

兩者結果相同。

也就是 map 傳入 id 相當於 id,都不會改變 Functor 內部 value。

Identity Law
fmap id = id

  • fmap id:將 id 傳入 fmap
  • id:只有 id
  • =:兩個 function 等價

laws000

Composition Law

f = map (*2) . map (+1) 
g = map ((*2) . (+1))

f [1, 2, 3]
g [1, 2, 3]
  • 多次使用 map 將 Functor 與 function 綁定

  • 使用 compose 將所有 function 先組合再一次與 map 綁定

    兩者結果相同。

也就是可將多次 map 的所有 function 先組合成單一 function 後,再一次傳進 map

Composition Law
fmap f . fmap g = fmap (f . g)

  • fmap f . fmap g:多次使用 fmap 傳入 function
  • fmap (f . g):將 function 先組合再傳入 fmap
  • =:兩個 function 等價

laws001

Conclusion

  • Haskell 稱為 id,在 Ramda 稱為 identity,在 Sanctuary 稱為 I
  • Haskell 稱為 fmap,在 Fantasy Land 稱為 map,為 Functor 必備 function