从Haskell中的字符串列表中删除字符串

时间:2013-05-12 00:21:19

标签: string haskell

我有一个关于Haskell的问题,这个问题一直困扰着我的大脑。我目前需要编写一个函数来删除字符串,"word"从字符串列表["hi", "today", "word", "Word", "WORD"]返回列表["hi", "today", "Word", "WORD"]。我不能使用任何高阶函数,只能求助于原始递归。

考虑到这个问题,我想也许我可以通过使用递归搜索第一个字符串的头部来解决它,如果它匹配"w"然后比较尾部的下一个头部,看看是否匹配"o"。但后来我很快意识到,在完成所有工作后,您将无法删除完整的字符串"word"

我的问题是如何比较列表中的整个字符串,而不是一次只比较1个元素:removeWord (x:xs)。它甚至可能吗?我是否必须编写辅助函数来帮助解决方案?

4 个答案:

答案 0 :(得分:3)

您不需要辅助功能,但如果您愿意,可以写一个。你基本上有三个条件:

  1. 你得到一个空列表。
  2. 您将获得一个列表,其第一个元素是您要删除的元素。
  3. 您会得到一个列表,其第一个元素是其他元素。
  4. 在其他语言中,您可以使用一组if-else语句,case语句或cond来执行此操作。在Haskell中,你可以用守卫来做到这一点:

    remove_word_recursive:: String -> [String] -> [String]
    remove_word_recursive _ []                              = []
    remove_word_recursive test_word (x:xs) | test_word == x = what in this case?
    remove_word_recursive test_word (x:xs)                  = what in default case?
    

    在这两个条件下填写此功能的正确结果,您应该完成。

    我认为你正在寻找的是关于字符串过滤器的这个问题的特殊情况:Haskell - filter string list based on some conditions。阅读关于已接受答案的一些讨论可能有助于您更多地了解Haskell。

答案 1 :(得分:2)

考虑基本情况:从空列表中删除单词将是空列表。这可以简单地写成:

removeWord [] _ = []

现在考虑列表不为空的情况。您使用x:xs match。您可以使用a guard在以下两个条件之间进行选择:

  1. x是您要删除的字词。 (x == word
  2. x不是您要删除的字词。 (otherwise

答案 2 :(得分:2)

由于您要删除列表元素,因此使用List Comprehension可以轻松完成。

myList = ["hi", "today", "word", "Word", "WORD"]
[x | x <- myList, x /= "word"]

结果是:

["hi","today","Word","WORD"]

答案 3 :(得分:0)

如果 isInfixOf 不被视为高阶,则

import Data.List (isInfixOf)
filter  (not . isInfixOf "word")  ["hi", "today", "word", "Word", "WORD"]