點燈坊

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

使用 join 攤平一層 Chain

Sam Xiao's Avatar 2021-06-13

若出現 Nested Chain,可使用 join 從內層攤平一層 Chain。

Version

Sanctuary 3.1.0

Nested Array

import { join } from 'sanctuary'

let data = [[1], [2], [3]]

let f = join

f (data) // ?

當有 Nested Array 時,join 會從內側將一層 Array 攤平。

join
[[a]] -> [a]
將兩層 Array 從內層攤平一層 Array

[[a]]:data 為 Nested Array

[a]:回傳為一層 Array

join000

import { join } from 'sanctuary'

let data = [[[1, 2, 3]]]

let f = join

f (data) // ?

若為三層 Array,一樣從內側開始攤平成兩層 Array。

join001

Nested Maybe

import { join, Just } from 'sanctuary'

let data = Just (Just (1))

let f = join

f (data) // ?

join 是用於 Chain,由於 Maybe 也是 Chain,因此也適用。

將 Nested Maybe 攤平成一層 Maybe。

join
Chain m => m (m a) -> m a
將兩層 Chain 從內層攤平一層 Chain

m (m a):data 為 Nested Chain

m a:回傳一層 Chain

join002

Nesed Pair

import { join, Pair } from 'sanctuary'

let data = Pair ('foo') (Pair ('bar') ('baz'))

let f = join

f (data) // ?

join 亦適用於 Nested Pair。

join003

Function

import { join, mult } from 'sanctuary'

let square = join (mult)

square (5) // ?

Function 也是 Chain,因此也適用於 join()

multiply() 有兩個 argument,當使用 join() 時,將降為一個 argument,且兩個 argument 值相同。

join
(r -> r -> a) -> (r -> a)
將 binary function 轉為 unary function

r -> r -> a:data 為 binary function

r -> a:回傳為 unary function

join004

Conclusion

  • Sanctuary 的 join 相當於 Ramda 的 unnest
  • 由於 Maybe 與 Pair 亦是 Chain,因此也可使用 join

Reference

Sanctuary, join