點燈坊

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

如何判斷 String 是否為 Palindrome ?

Sam Xiao's Avatar 2021-06-12

若要判斷 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 相等

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。

palindrome001

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() 加以重構。
palindrome003

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)

palindrome002

Conclusion

  • f(x, g(x))f(g(x), x) 為實務上常見 pattern,其中 f(x, g(x))ap(),而 f(g(x), x)chain()