我需要检查我的字符串是否包含特定字符.
我试过这个:
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
模块.