过滤多个元素,删除Haskell中列表中的单词

时间:2014-05-03 16:07:40

标签: list haskell filter

我对Haskell很新,我很快就吓坏了。 ; - )

我需要创建一个函数,它接受字符串列表并删除每个单词中带* - +的单词,最后所有字母都应该小写。

现在我明白了:

list3 [] = []
list3 xs = map (filter (/='*' )) xs

我确定它并不难,但我只是不明白我不仅可以删除单个*而且还可以删除整个单词*。另外,我不知道如何将 - 和+放入过滤器功能。

示例:list3 [" Tree-House"," CAT"," * Haskell - "]应输出:[" cat&#34 ]

谢谢!我非常感谢你的帮助。


我怎么能把所有东西放在小写字母上?我试过这样,但是我遇到了类型错误。

list3 xs = toLower (filter (not.any (`elem` "*-+")) xs)

2 个答案:

答案 0 :(得分:5)

您想要过滤外部列表,而不是每个单独的字符串。这就是为什么你只滤除个别角色,而不是整个单词。

过滤掉包含*

的字词
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

答案 1 :(得分:2)

这个问题可以一步一步解决:

  1. 定义一个函数来检查另一个字符串中是否出现任何字符串

    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
    

    isInclude es xs = or $ map (`elem` xs) es
    
  2. 现在你可以找到不包含任何这些字符的字符串列表中的所有字符串

    filter (not . isInclude "*-+") ls
    

    此处ls是字符串

  3. 的列表
  4. 最后,您可以map toLowerData.Char到每个字符串,将其字符转换为小写

    list3 ls = map (map toLower) $ filter (not . isInclude "*-+") ls