若要判斷 String 是否為 Palindrome,可使用 reverse()
與 equals()
判斷。
Version
Ramda 0.27.1
reverse()
import { equals, reverse } from 'ramda'
let isPalindrome = s => equals(s, reverse(s))
isPalindrome('cheese') // ?
isPalindrome('racecar') // ?
reverse()
:將 String 反轉equals()
:判斷反轉後 String 是否與原 String 相等
converge()
import { converge, equals, identity as I, reverse } from 'ramda'
let isPalindrome = converge(
equals, [I, reverse]
)
isPalindrome('cheese') // ?
isPalindrome('racecar') // ?
使用 converge()
組合 isPalindrome()
使其 Point-free。
lift()
import { lift, equals, identity as I, reverse } from 'ramda'
let isPalindrome = lift(equals)(I, reverse)
isPalindrome('cheese') // ?
isPalindrome('racecar') // ?
事實上 converge(f, [g, h]) = lift(f)(g, h)
,可使用 lift()
加以重構。
ap()
import { ap, equals, reverse } from 'ramda'
let isPalindrome = ap(equals, reverse)
isPalindrome('cheese') // ?
isPalindrome('racecar') // ?
事實上 ap(f, g)(x) = f(x, g(x)))
,或者出現 converge(f, [I, g])
的 pattern 時,可重構成 ap(f, g)
。
Conclusion
f(x, g(x))
與f(g(x), x)
為實務上常見 pattern,其中f(x, g(x))
為ap()
,而f(g(x), x)
為chain()