我需要检查我的字符串是否包含特定字符.
我试过这个:
charFound :: Char -> String -> Bool
charFound c s = filter(\x -> x == c) s
Run Code Online (Sandbox Code Playgroud)
但它给了我:
无法将预期类型
Bool与实际类型匹配[Char]
我知道那个过滤器:
返回一个由列表成员(第二个参数)构成的列表,它满足第一个参数给出的条件.
我怎么能达到目标并返回一个布尔而不是列表?
fuz*_*fuz 10
出于您的目的,您可以使用elem :: Eq a => a -> [a] -> Bool前奏中的功能.它完全符合它在标签上所说的内容.要实现这个功能,我会使用这样的东西:
elem = any . (==)
Run Code Online (Sandbox Code Playgroud)
甚至更基本的:
elem x = foldr ((||) . (x ==)) False
Run Code Online (Sandbox Code Playgroud)
请注意,由于其短路行为,(||)只要x找到它,也可以使用无限列表.
类型filter是(a -> Bool) -> [a] -> [a].
你提供了第一个有类型Char -> Bool(正确)的参数,然后是第二个参数,它是String(那是[Char])正确的,所以类型filter (\x -> x == c) s是[Char].
但是你提供的类型签名表示函数返回a Bool,它与返回的实际类型不匹配.
您可能想要使用any而不是filter.它的类型是(a -> Bool) -> [a] -> Bool.
当且仅当列表的所有元素都满足传递的谓词时all,还有一个函数返回True.您也可以考虑函数or和and给定[Bool]计算值的分离或结合的函数.所以any f = or . map f和all f = and . map f.
对于所有与列表相关的功能,请参阅Data.List模块.