Haskell,如何检查palindrom

时间:2016-04-28 14:02:17

标签: function haskell

我有一个小问题。即使角色是大写字母,我怎样才能将我的函数扩展为返回True

我的功能适用于列表中的字符串:

f1 w = w == reverse w

Test:
*Main> let test = ["Boob"]
*Main> f1 test
True

*Main> let test2 = "Boob"
*Main> f1 test2
False

的问候,

马丁

1 个答案:

答案 0 :(得分:6)

怎么样

import Data.Char (toLower)

f1 :: String -> Bool
f1 w = w == reverse w

f2 :: String -> Bool
f2 str = f1 $ map toLower str

但我建议的是为你的功能使用好名字

testPalindrome = f1
ignoreCase = map toLower

然后

testPalindrome' = testPalindrome . ignoreCase

更新

.是函数的连接:

(.) :: (b -> c) -> (a -> b) -> (a -> c)
(g . f) x = g (f x)


     f
 A -----> B
  \       |
   \      |
g.f \     |g
     \    |
      V   V
        C

UPDATE2

@dfeuer在评论中提到了一个非常优雅的解决方案

import Data.Function (on)
import Data.Char (toLower)

(=~=) :: String -> String -> Bool
-- | Equivalence of Strings, by ignoring the case
(=~=) = (==) `on` toLower

testPalindrome :: String -> Bool
testPalindrome w = w =~= reverse w

函数on(使用带有反引号语法的中缀)采用函数(==)和"修饰符函数" toLower并将其应用于该函数的参数。

(f `on` g) x y = f (g x) (g y)

这对于(==)(<)等二元运算符特别有用。