點燈坊

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

使用 mapi() 讓 Callback 有 Index

Sam Xiao's Avatar 2020-08-17

Ramda 的 map() 其 callback 並沒有包含 Index,雖然可使用 addIndex()map() 重新產生新 Function,因為太常使用,已經收錄在 Wink-fp。

Version

macOS Catalina 10.15.6
Wink-fp 1.20.77

addIndex()

import { map, addIndex } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let mapi = addIndex(map)

let f = mapi((x, i) => `${i}: ${x.title}`)

f(data) // ?

第 9 行

let mapi = addIndex(map)

let f = mapi((x, i) => `${i}: ${x.title}`)

map() 的 callback 並沒有包含 index,Ramda 正規做法是使用 addIndex() higher order function 重新將 map() 變成 mapi()

map000

mapi()

import { mapi } from 'wink-fp'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = mapi((x, i) => `${i}: ${x.title}`)

f(data) // ?

Wink-fp 已經包含 mapi(),可直接使用。

mapi()
Functor f => ((a, i) → b) → f a → f b
map() 功能相同,但多了 index

(a, i) -> b:callback 包含 index

f a:data 為 Functor

f b:回傳新的 Functor

mapi001

formatN()

import { mapi, formatN } from 'wink-fp'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = mapi(formatN(2)('{1}: {title}'))

f(data) // ?

mapi() 也可搭配前他 function 使其 point-free。

mapi002

Conclusion

  • mapi() 補上了 map() 常需要 index 功能

Reference

Ramda, map()
Ramda, addIndex()