點燈坊

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

使用 unnest() 攤平一層 Chain

Sam Xiao's Avatar 2019-09-28

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

Version

Ramda 0.27.1

Nested Array

import { unnest } from 'ramda'

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

let f = unnest

f(data) // ?

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

unnest()
[[a]] -> [a]
將兩層 Array 從內層攤平一層 Array

[[a]]:data 為 Nested Array

[a]:回傳一層 Array

unnest000

import { unnest } from 'ramda'

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

let f = unnest

f(data) // ?

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

unnest001

Nested Maybe

import { unnest } from 'ramda'
import { Just } from 'sanctuary'

let data = Just(Just(1))

let f = unnest

f(data) // ?

unnest() 是用於 Chain,由於 Maybe Monad 也是 Chain,因此也適用。

將 Nested Maybe 攤平成一層 Maybe。

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

Chain mm 為 Chain

m (m a):data 為 Nested Chain

m a:回傳一層 Chain

unnest002

Nested Pair

import { unnest } from 'ramda'
import { Pair } from 'sanctuary'

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

let f = unnest

f(data) // ?

unnest() 亦適用於 Nested Pair。

unnest003

Function

import { unnest, multiply } from 'ramda'

let square = unnest(multiply)

square(5) // ?

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

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

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

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

r -> a:回傳為 unary function

unnest004

Conclusion

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

Reference

Ramda, unnest()