zip
只能制式的將兩個 Array 合併成 Array Pair,若想將兩個 Array 合併成其他形式則要使用 zipWith
。
Version
Sanctuary 3.1.0
zip
import { zip } from 'sanctuary'
let girls = [
{ name: 'Mary' },
{ name: 'Jessie' }
]
let boys = [
{ name: 'John', car: 'BMW' },
{ name: 'Tomy', car: 'TOYOTA' },
{ name: 'Paul', car: 'Benz' }
]
let f = zip
f (girls) (boys) // ?
想將 girls
與 boys
兩個 Array 合併,直覺會使用 zip
。
但 zip
只能合併成制式的 Array Pair。
zipWith
import { zipWith } from 'sanctuary'
let girls = [
{ name: 'Mary' },
{ name: 'Jessie' }
]
let boys = [
{ name: 'John', car: 'BMW' },
{ name: 'Tomy', car: 'TOYOTA' },
{ name: 'Paul', car: 'Benz' }
]
let f = zipWith (x => y => `${x.name}: ${y.car}`)
f (girls) (boys) // ?
若想合併成 Array String,且格式為 name: car
,其中 name
來自於 girls
,而 car
來自於 boys
。
對於自訂形式合併,可使用 zipWith
提供自訂 function。
zipWith
(a -> b -> c) -> Array a -> Array b -> Array c
自行提供 function 的zip
(a -> b → c)
:傳入 function 描述合併方式
Array a
:data 為 Array
Array b
:data 為 Array
Array c
:回傳合併後新 Array
zip
相當於zipWith (Pair)
Point-free
import { zipWith, prop } from 'sanctuary'
import { useWith } from 'ramda'
import { formatN } from 'wink-fp'
let girls = [
{ name: 'Mary' },
{ name: 'Jessie' }
]
let boys = [
{ name: 'John', car: 'BMW' },
{ name: 'Tomy', car: 'TOYOTA' },
{ name: 'Paul', car: 'Benz' }
]
let toString = useWith (
formatN (2) ('{0}: {1}'), [prop ('name'), prop ('car')]
)
let f = zipWith (toString)
f (girls) (boys) // ?
若想進一步將傳入 zipWith
的 function 也 Point-free,可使用 useWith
加以組合:
formatN (2) ('{0}: {1}')
:建立 template stringprop ('name')
:從girls
取出name
prop ('car')
:從boys
取出car
Conclusion
- Ramda 的
zipWith
傳入 function 的 type signature 為(a, b) -> c
;而 Sanctuary 的zipWith
傳入 function 的 type signature 為a -> b -> c
,僅管不相同,但都可使用useWith
加以 Point-free