點燈坊

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

使用 zip 將兩個 Array 合併成 Array Pair

Sam Xiao's Avatar 2021-06-21

zip 為 FP 代表性 Function,可直接將兩個 Array 合併成 Array Pair。

Version

Sanctuary 3.1.0

zip

import { zip } from 'sanctuary'

let data1 = [1, 2, 3]
let data2 = [2, 4, 6]

let f = zip

f (data1) (data2) // ?

zip 可將兩個 Array 合併成 Array Pair。

zip
Array a -> Array b -> Array (Pair a b)
將兩個 Array 合併成 Array Pair

Array a:data 為 Array

Array b :data 為 Array

Array (Pair a b):回傳為 Array Pair

zip000

import { zip } from 'sanctuary'

let data1 = [1, 2, 3]
let data2 = [2, 4, 6, 8]

let f = zip

f (data1) (data2) // ?

若兩個 Array 長度不同,將以較短的 Array 為準。

zip001

String

import { zip } from 'sanctuary'

let data1 = 'dog'
let data2 = 'rabbit'

let f = zip

f (data1) (data2) // ?

zip 若用在 String,會發生 error。

因為 Sanctuary 認為 Array a 與 String 是不同型別,因此產生 error

zip002

import S from 'sanctuary'

let { unchecked: { zip }} = S

let data1 = 'dog'
let data2 = 'rabbit'

let f = zip

f (data1) (data2) // ?

若不檢查型別,則 zip 可用於 String。

zip004

Different Type

import { zip } from 'sanctuary'

let data1 = ['a', 'b', 'c']
let data2 = [1, 2, 3]

let f = zip

f (data1) (data2) // ?

兩個 Array 也可使用不同型別。

zip003

Conclusion

  • Haskell 與 Ramda 的 zip 都可使用 String,Sanctuary 的 zip 預設不能使用 String,因為 Sanctuary 認為 Array a 與 String 型別並不相同,必須將型別檢查關閉才能使用 String
  • Sanctuary 的 zip 會明確回傳 Array Pair(a b),而 Ramda 的 zip 則只回傳 [[a, b]]

Reference

Sanctuary, zip