检查字符串是否包含特定字符

时间:2015-08-23 12:41:38

标签: haskell

我需要检查我的字符串是否包含特定字符。

我试过了:

charFound :: Char -> String -> Bool
charFound c s = filter(\x -> x == c) s

但它给了我:

  

无法将预期类型Bool与实际类型[Char]

匹配

我知道过滤器:

  

返回一个由列表成员(第二个参数)构成的列表,它满足第一个参数给出的条件。

我怎样才能达到目标并返回一个bool而不是一个列表?

2 个答案:

答案 0 :(得分:9)

出于您的目的,您可以使用前奏中的elem :: Eq a => a -> [a] -> Bool函数。它完全符合它在标签上所说的内容。要实现这个功能,我会使用这样的东西:

elem = any . (==)

或更基本的:

elem x = foldr ((||) . (x ==)) False

请注意,由于(||)的短路行为,只要找到x,这也适用于无限列表。

答案 1 :(得分:7)

filter的类型为(a -> Bool) -> [a] -> [a]

您提供了第一个参数,其类型为Char -> Bool(这是正确的),然后第二个参数是String(即[Char]),这是正确的,所以类型为filter (\x -> x == c) s[Char]

但是你提供的类型签名表示该函数返回Bool,它与返回的实际类型不匹配。

您可能希望使用any代替filter。它的类型是(a -> Bool) -> [a] -> Bool

当且仅当列表的所有元素都满足传递的谓词时,还有all函数返回True。您还可以考虑给出or的函数and[Bool]来计算值的析取或结合。所以any f = or . map fall f = and . map f

对于所有与列表相关的函数,请参阅Data.List模块。