我对Haskell很新,我很快就吓坏了。 ; - )
我需要创建一个函数,它接受字符串列表并删除每个单词中带* - +的单词,最后所有字母都应该小写。
现在我明白了:
list3 [] = []
list3 xs = map (filter (/='*' )) xs
我确定它并不难,但我只是不明白我不仅可以删除单个*而且还可以删除整个单词*。另外,我不知道如何将 - 和+放入过滤器功能。
示例:list3 [" Tree-House"," CAT"," * Haskell - "]应输出:[" cat&#34 ]
谢谢!我非常感谢你的帮助。
我怎么能把所有东西放在小写字母上?我试过这样,但是我遇到了类型错误。
list3 xs = toLower (filter (not.any (`elem` "*-+")) xs)
答案 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)
这个问题可以一步一步解决:
定义一个函数来检查另一个字符串中是否出现任何字符串
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
现在你可以找到不包含任何这些字符的字符串列表中的所有字符串
filter (not . isInclude "*-+") ls
此处ls
是字符串
最后,您可以map
toLower
从Data.Char
到每个字符串,将其字符转换为小写
list3 ls = map (map toLower) $ filter (not . isInclude "*-+") ls