haskell编程中的数据类型

时间:2011-03-27 02:30:54

标签: haskell

这是一个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

我知道这是一个可怜的代码..请帮助我改进它。

3 个答案:

答案 0 :(得分:4)

关键是,通常是递归。

列表包含重复项,如果:

  1. 第一个元素在列表的其余部分中有重复,或者
  2. 列表的其余部分包含重复的
  3. 除此之外,空列表中没有重复项,而且还有您的程序。

    (我让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)

您可以轻松(但不是非常有效)使用nub(\\)获取所有重复项的列表。

我认为这是一个功课:这个建议应该给你一个很好的起点。