我有一个小问题。即使角色是大写字母,我怎样才能将我的函数扩展为返回True
。
我的功能适用于列表中的字符串:
f1 w = w == reverse w
Test:
*Main> let test = ["Boob"]
*Main> f1 test
True
*Main> let test2 = "Boob"
*Main> f1 test2
False
的问候,
马丁
答案 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
@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)
这对于(==)
,(<)
等二元运算符特别有用。