我需要检查我的字符串是否包含特定字符。
我试过了:
charFound :: Char -> String -> Bool
charFound c s = filter(\x -> x == c) s
但它给了我:
无法将预期类型
匹配Bool
与实际类型[Char]
我知道过滤器:
返回一个由列表成员(第二个参数)构成的列表,它满足第一个参数给出的条件。
我怎样才能达到目标并返回一个bool而不是一个列表?
答案 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 f
和all f = and . map f
。
对于所有与列表相关的函数,请参阅Data.List
模块。