这是一个haskell代码,用于查找列表中的第一个重复元素。如果你有两个这样的列表:L1 = {1,2,3,4} L2 = {1,2,3,1}那么第一个的结果将是没有找到重复,第二个的结果应该是整数1.如果列表有L3 = {1,2,1,3,3}答案应该仍为1。
我尝试过这样做,但坚持条件检查: 我们将使用union数据类型。
data Res a = DuplicateFound a | NoDuplicateFound
deriving (Show,Eq)
findDuplicate [] = NoDuplicateFound
findDuplicate (x:xs) = if (condition???)
where
aux x [] = NoDuplicateFound
aux x (y:ys) = if x == y then DuplicateFound x
else aux x ys
else NoDuplicateFound
我知道这是一个可怜的代码..请帮助我改进它。
答案 0 :(得分:4)
关键是,通常是递归。
列表包含重复项,如果:
除此之外,空列表中没有重复项,而且还有您的程序。
(我让hasElement只返回一个Bool,并使用Maybe a作为返回值。)
答案 1 :(得分:2)
这段代码是一个好的开始。您已编写的aux
函数会搜索元素是否在列表中。现在你只需要检查列表其余部分的第一个元素,如果失败了,那么第二个元素就会反对其后的所有元素,等等。
我只需将aux
重命名为hasElement
(永远不要低估好名字的澄清力量):
hasElement x [] = NoDuplicateFound
hasElement x (y:ys) = if x == y then DuplicateFound x
else hasElement x ys
然后:
findDuplicate [] = NoDuplicateFound
findDuplicate (x:xs) =
case hasElement x xs of
DuplicateFound dup -> ...
NoDuplicateFound -> ...
我会让你填写...
。祝你好运,感谢你在来这里寻求帮助前尝试解决方案。这让我更愿意付出努力。
答案 2 :(得分:0)