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 的结果,并将其添加到空列表中。我预计该步骤将测试每个项目是否包含在输出列表中(第一个测试的元素不存在)并将添加任何尚未包含到输出列表中的内容。显然不是 :-)