List 过滤多个元素,删除Haskell列表中的单词
我对哈斯克尔完全陌生,我很快就要发疯了 我需要创建一个函数,该函数接受字符串列表并删除其中包含*-+的每个单词,并且所有字母的结尾都应为小写 现在我知道了:List 过滤多个元素,删除Haskell列表中的单词,list,haskell,filter,List,Haskell,Filter,我对哈斯克尔完全陌生,我很快就要发疯了 我需要创建一个函数,该函数接受字符串列表并删除其中包含*-+的每个单词,并且所有字母的结尾都应为小写 现在我知道了: list3 [] = [] list3 xs = map (filter (/='*' )) xs 我真的很确定这并不难,但我只是不明白我怎么能不仅删除一个*而且删除一个包含*的单词。此外,我不知道如何将-和+放入过滤器函数中 示例:list3[“树屋”、“猫”、“*Haskell-”]应输出:[“猫”] 谢谢大家!!我真的很感谢你的帮助
list3 [] = []
list3 xs = map (filter (/='*' )) xs
我真的很确定这并不难,但我只是不明白我怎么能不仅删除一个*而且删除一个包含*的单词。此外,我不知道如何将-和+放入过滤器函数中
示例:list3[“树屋”、“猫”、“*Haskell-”]应输出:[“猫”]
谢谢大家!!我真的很感谢你的帮助
我怎么能把所有的字都写成小写呢?我试着这样做,但我得到了一个类型错误
list3 xs = toLower (filter (not.any (`elem` "*-+")) xs)
您希望筛选外部列表,而不是每个单独的字符串。这就是为什么只过滤单个字符,而不是整个单词 筛选出包含
*
list3 = filter (not(elem '*'))
要过滤掉包含任何*+-
的单词,您需要更改谓词。在本例中,我们希望找到包含*-或+,因此我们使用谓词
any (`elem` "*-+")
但这会过滤掉不包含这些字符的单词,我们想要相反的结果,所以我们写:
list3 = filter (not.any (`elem` "*-+"))
然后,要使所有字符都小写,可以在每个字符串上映射toLower
import Data.Char (toLower)
list3 xs = map (map toLower) $ filter (not.any (`elem` "*-+")) xs
这个问题可以逐步解决:
isInclude es xs = or $ map (\e -> e `elem` xs) es
对于要检查的es
中的每个元素,例如“*”、“-”或“+”,如果它出现在xs
中,lambda抽象(\e->e
elemxs)
将返回true。如果lambda抽象中的任何一个为真,isInclude
将为真
isInclude
也可以这样实现
isInclude es xs = or $ map (flip elem xs) es
或
filter (not . isInclude "*-+") ls
这里的ls
是一个字符串列表Data.Char
映射到每个字符串,将其字符转换为小写
list3 ls = map (map toLower) $ filter (not . isInclude "*-+") ls
非常感谢。特别感谢你的解释,所以我真的理解了。非常感谢!在尝试了很多之后,我终于得到了它。
list3 ls = map (map toLower) $ filter (not . isInclude "*-+") ls