點燈坊

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

converge(f, [I, g]) 與 ap(f, g) 等效性

Sam Xiao's Avatar 2021-06-12

在重構階段常會出現 converge(f, [I, g]) Pattern,此時可重構成 ap(f, g)

Version

Ramda 0.27.1

reverse()

import { equals, reverse } from 'ramda'

let isPalindrome = s => equals(s, reverse(s))

isPalindrome('cheese') // ?
isPalindrome('racecar') // ?

想要判斷 String 是否為 Palindrome,可使用 reverse()equals() 判斷:

  • reverse():將 String 反轉
  • equals():判斷反轉後 String 是否與原 String 相等

palindrome000

converge()

import { converge, equals, identity as I, reverse } from 'ramda'

let isPalindrome = converge(
  equals, [I, reverse]
)

isPalindrome('cheese') // ?
isPalindrome('racecar') // ?

可使用 converge() 組合 isPalindrome() 使其 Point-free。

可發現出現 converge(f, [I, g]) pattern。

palindrome001

ap()

import { ap, equals, reverse } from 'ramda'

let isPalindrome = ap(equals, reverse)

isPalindrome('cheese') // ?
isPalindrome('racecar') // ?

可將 converge(f, [I, g]) 重構成 ap(f, g)

palindrome002

Conclusion

  • 可能一時看不出該使用 ap(),但只要看到 converge(f, [I, g]) 就可重構成 ap()