繁体   English   中英

haskell编程中的数据类型

[英]data types in haskell programming

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

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

关键是,通常是递归。

列表包含重复项,如果:

  1. 第一个元素在列表的其余部分有一个副本,或者
  2. 列表的其余部分包含重复项

除此之外,空列表不包含重复项,而且还有您的程序。

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

这段代码是一个好的开始。 您已编写的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   -> ...

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM