【发布时间】:2011-04-09 12:17:00
【问题描述】:
test :: [String] -> [String]
test = foldr step []
where step x ys
| elem x ys = x : ys
| otherwise = ys
我正在尝试构建一个包含所有输入的不同字符串的新列表。我的测试数据是:
test ["one", "one", "two", "two", "three"]
预期结果:
["one", "two", "three"]
我是 Haskell 的新手,我确信我错过了一些非常基本和明显的东西,但是已经没有办法去探索了。能否指点一下我的思路不足的地方?
实际回复是[]。似乎永远不会满足第一个保护条件(如果我将其替换为True,则会复制原始列表),因此永远不会构建输出列表。
我的理解是折叠会在列表的每个项目上累积 step 的结果,并将其添加到空列表中。我预计该步骤将测试每个项目是否包含在输出列表中(第一个测试的元素不存在)并将添加任何尚未包含到输出列表中的内容。显然不是:-)
【问题讨论】:
-
谢谢特拉维斯。正如我所说 - 一些完全明显的遗漏。
-
@Travis:建议你把你的评论变成一个答案,这样这个问题就不会在没有答案的堆里漂浮,直到天结束。此外,免费代表将是一个加号。 @Chris:如果您在每行的开头添加额外的四个空格,您的代码将正确呈现。
-
@Jack:我已经修复了代码格式。
-
@Jack - 感谢您整理格式并告知我如何正确呈现它。 @Travis - 感谢您提出这个答案。