5

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

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

我的问题实际上是如何比较列表中的整个字符串,而不是一次仅将 1 个元素与以下内容进行比较:removeWord (x:xs)。甚至可能吗?我是否必须编写一个辅助函数来帮助解决问题?

4

4 回答 4

3

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

removeWord [] _ = []

现在考虑列表不为空的情况。您其与x:xs. 您可以使用警卫在这两个条件之间进行选择:

  1. x是您要删除的单词。( x == word)
  2. x不是您要删除的词。( otherwise)
于 2013-05-12T00:27:11.523 回答
3

您不需要辅助函数,但如果您愿意,您可以编写一个。你基本上有3个条件:

  1. 你得到一个空列表。
  2. 您会得到一个列表,其第一个元素是您要删除的元素。
  3. 您会得到一个列表,其第一个元素是其他任何元素。

在其他语言中,您可以使用一组 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。

于 2013-05-12T01:53:45.820 回答
3

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

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

结果是:

["hi","today","Word","WORD"]
于 2015-05-04T05:07:53.587 回答
0

如果isInfixOf不被视为高阶,则

import Data.List (isInfixOf)
filter  (not . isInfixOf "word")  ["hi", "today", "word", "Word", "WORD"]
于 2020-08-10T07:15:39.943 回答