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
    elem
    xs)
    将返回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