2013-05-06 192 views
0

我刚开始学习Haskell删除列表元素(Haskell)

我有一个单词列表,并有

  1. 删除所有单词的第一个字母,然后
  2. 删除以字母“A”开头的单词,并
  3. 把剩下的词一起。

我能够做到1和3,但无法弄清楚如何删除与启动字的“一”

到目前为止,它看起来像:

concat(--remove words with a--(map (drop 1) ["Tree","House","Monkey","Haskell","Informatik"])) 

谢谢Frerich拉贝,它的工作原理

+4

'filter'和''!可能是有用的。 – chirlu 2013-05-06 19:09:19

+2

相反,如果'!!',你可能更喜欢'头'。别忘了 - 一个字符串只是一个字符列表。 – Steve314 2013-05-06 19:16:25

+0

你能更具体吗? 如何过滤出单词? – user2355793 2013-05-06 19:17:24

回答

7

最好以其他方式思考。您想要过滤列表,以便保留不以'a'开头的单词。您可以使用标准功能filter来完成此操作。

filter :: (a -> Bool) -> [a] -> [a] 

的第一个参数filter是应该返回True为您想保留的话,和False您要删除的那些功能,第二个参数是你的清单。

filter doesNotBeginWithA (... your list goes here ...) 

现在你必须实现这个功能。您可以使用简单模式匹配来完成此操作。

doesNotBeginWithA :: String -> Bool 
doesNotBeginWithA xs = ... 

如果你熟悉函数组合,使用not反转你的逻辑是稍微更地道。你也可以概括它一点:

filter (not . beginsWith 'a') (...) 

现在,你必须提供这个功能来代替:

beginsWith :: Char -> String -> Bool 
beginsWith c xs = ...