从haskell中的列表中删除重复值

从haskell中的列表中删除重复值,haskell,Haskell,我需要在Haskell中完成一些任务: 查找列表的最大值及其出现的次数: maxCount [2,4,7,2,3] --> [7,1] 从列表中删除重复的值 delRep [1,3,2,1,4] --> [3,2,4] 从列表中删除元素的所有实例: delete [1,3,4,1] 1 --> [3,4] 问题1 maxAndReps l = let m = maximum l reps = length $ filter (=

我需要在Haskell中完成一些任务:

  • 查找列表的最大值及其出现的次数:

    maxCount [2,4,7,2,3] --> [7,1]
    
  • 从列表中删除重复的值

    delRep [1,3,2,1,4] --> [3,2,4]
    
  • 从列表中删除元素的所有实例:

    delete [1,3,4,1] 1 --> [3,4]
    
  • 问题1

    maxAndReps l = let m = maximum l
                       reps = length $ filter (== m) l
                   in [m,reps]
    
    这个解的渐近性能非常差,因为列表被遍历了两次。理想情况下,解决方案将找到最大值并计算一次过程中的重复次数。如果以折叠方式编写
    最大值
    过滤器
    长度
    ,您应该了解如何将它们组合成一个过程

    而且,返回元组而不是列表会更自然

    问题2。查看如何使用
    Data.Set.Set
    。此外,输出列表是否需要按相同的顺序排列?如果不是,有一个特别简单的解决方案


    问题3。我以上对问题1的回答涵盖了这一点。该函数从列表中删除所有非最大值,这正是问题所在。只要弄清楚它是如何工作的,你就可以解决这个问题。

    没有内置函数。。看起来很难看:D

    对第一个做了一点修改,不喜欢只对整数起作用

    -- 1.
    maxic :: Ord a => [a] -> (a, Integer)
    maxic xs = (x,c)
      where x = maxi xs
             where maxi :: Ord a => [a] -> a
                   maxi [] = error "empty list"
                   maxi (x:xs) = iter xs x
                     where iter [] m = m
                           iter (x:xs) m | x > m = iter xs x
                           iter (_:xs) m = iter xs m
            c = cnt xs x
              where cnt :: Eq a => [a] -> a -> Integer
                    cnt (x:xs) e | x==e = 1 + (cnt xs e)
                    cnt (_:xs) e = cnt xs e
                    cnt _ _ = 0
    
    -- 2.
    remrep :: Eq a => [a] -> [a]
    remrep xs = reverse (iter xs [])
      where iter (x:xs) res | elem x res = iter xs (filter (/= x) res)
            iter (x:xs) res = iter xs (x:res)
            iter [] res = res
    
    -- 3.
    remo :: Eq a => [a] -> a -> [a]
    remo [] e = []
    remo (x:xs) e | x==e = remo xs e
    remo (x:xs) e = (x : remo xs e)
    

    好吧,我作弊了,我用了,过滤器,但是你可以用
    remo
    来做这个,而且
    elem
    写起来应该很简单。

    你试过什么,你到底不明白什么?我们不是来为你写代码的。@John L我会说:这是家庭作业吗?如果是的话,那就先试试,否则我拒绝回答,除非你付钱给我。很多。@Ziyao Wei:我心情很好,所以我试着帮忙。我考虑过写一个模糊的响应,但我不想那么努力。@John L你至少可以用
    pointfree
    来模糊一点!我对问题进行了编辑,使其看起来像样(并添加了家庭作业标签),但我仍然不喜欢提问的方式。您可能对使用感兴趣。您确定这是O(n^2)吗?也就是说,
    maximum
    a
    filter
    不应该都是O(n)?这肯定是O(n),而不是O(n^2),更不用说O(kn^2)。我所看到的唯一渐进性能问题是内存的线性使用,因为列表被多次遍历。@hvr和@Rotsor,你们都是对的。就寝后教我继续这样做。我已经把它修好了一点。+1很好的指导,但没有为他解决问题。-1感谢他为他做了完整的家庭作业,特别是没有指导或解释。你能为练习3提供什么指导?说真的,如果他太懒,地球上没有任何指导会有帮助。。。我这样做只是为了好玩,几天前学了一些基础知识。也许只是把你的手指指向
    filter
    函数,让他知道如何使用它。他可能处于基础水平(学习模式匹配、处理列表,所有这些东西,你知道……),应该在没有任何“花哨”内置的情况下解决这个问题。那不是我所说的指导。那就不要说关于#3?让他开始对付其他人。我知道你只是在享受实现这一点的乐趣,但这并不意味着你需要给他额外的懒惰机会。不管怎样,我只是按照我的价值观投票。