haskell编程中的数据类型

haskell编程中的数据类型,haskell,Haskell,查找列表中的第一个重复元素是haskell代码。若你们有两个这样的列表:L1={1,2,3,4}L2={1,2,3,1},那个么第一个的结果将不会重复,第二个的结果应该是整数1。若一个列表有L3={1,2,1,3,3},那个么答案仍然应该是1 我尝试过这样做,但坚持进行状态检查: 我们将使用联合数据类型 data Res a = DuplicateFound a | NoDuplicateFound deriving (Show,Eq) findDuplicate

查找列表中的第一个重复元素是haskell代码。若你们有两个这样的列表:L1={1,2,3,4}L2={1,2,3,1},那个么第一个的结果将不会重复,第二个的结果应该是整数1。若一个列表有L3={1,2,1,3,3},那个么答案仍然应该是1

我尝试过这样做,但坚持进行状态检查: 我们将使用联合数据类型

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

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

这是一个好的开始。您已经编写的
aux
函数将进行搜索,以查看元素是否在列表中。现在,您只需要对照列表的其余部分检查第一个元素,如果检查失败,则第二个元素对照它之后的所有元素,以此类推

我将把
aux
重命名为
haseelement
(永远不要低估好名字的澄清能力):

然后:


我将让您填写
s。祝你好运,谢谢你在来这里寻求帮助之前尝试解决方案。这让我更愿意为我的答案付出努力。

关键是递归

如果出现以下情况之一,列表将包含重复项:

  • 第一个元素在列表的其余部分有重复项,或者
  • 列表的其余部分包含一个副本
  • 此外,一个空列表不包含重复项,这就是您的程序

    (我会让hasElement只返回一个Bool,并可能使用a作为返回值。)

    您可以很容易(但效率不高)使用and获得所有重复项的列表


    我认为这是一个家庭作业:这个建议应该给你一个很好的起点。

    完全重复,但我赞扬这位作者尝试了一个解决方案并将其发布,而不是仅仅将他的家庭作业转发到网站上+1I不会写列表L1={1,2,3,4},但L1=[1,2,3,4]。因为方括号通常表示列表和花括号,所以可以减少混淆……那么它们在Haskell中表示什么呢?例如,在Erlang中,它们是元组。谢谢,但我仍然不清楚…案例x==y将检查第一个元素是否等于其余元素的头部。但我不知道如何检查第二个元素。数据Res a=duplicateFind a | noduplicateFind派生(Show,Eq)aux x[]=noduplicateFind aux(y:ys)=如果x==y则DuplicateFound x else aux x ys findDuplicate[]=Nothing findDuplicate(x:xs)=case aux x xs of DuplicateFound x`->“第一个副本:”++(show x)NodeUpplicateFound->“无重复项”@cuddle,尝试让
    findDuplicate
    递归调用自身。我建议返回一个
    Res
    ,这还不应该是I/O代码。
    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   -> ...