我有一个关于Haskell的问题,这个问题一直困扰着我的大脑。我目前需要编写一个函数来删除字符串,"word"
从字符串列表["hi", "today", "word", "Word", "WORD"]
返回列表["hi", "today", "Word", "WORD"]
。我不能使用任何高阶函数,只能求助于原始递归。
考虑到这个问题,我想也许我可以通过使用递归搜索第一个字符串的头部来解决它,如果它匹配"w"
然后比较尾部的下一个头部,看看是否匹配"o"
。但后来我很快意识到,在完成所有工作后,您将无法删除完整的字符串"word"
。
我的问题是如何比较列表中的整个字符串,而不是一次只比较1个元素:removeWord (x:xs)
。它甚至可能吗?我是否必须编写辅助函数来帮助解决方案?
答案 0 :(得分: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。
答案 1 :(得分:2)
考虑基本情况:从空列表中删除单词将是空列表。这可以简单地写成:
removeWord [] _ = []
现在考虑列表不为空的情况。您使用x:xs
match。您可以使用a guard在以下两个条件之间进行选择:
x
是您要删除的字词。 (x == word
)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"]