代码之家  ›  专栏  ›  技术社区  ›  Matt

Haskell-创建集(唯一排序列表)-无递归,无nub

  •  3
  • Matt  · 技术社区  · 15 年前

    是否可以创建一个函数来创建一个带有列表输入的集合。

    我就是想不出不使用递归的方法。

    我可以使用高阶功能,如折叠,过滤,地图,邮政编码。我的函数不能有递归。

    显然我不能用nub。

    我一直绞尽脑汁想弄清楚如何在没有递归或任何类型的循环的情况下消除重复(至少我不认为我们可以使用循环,我会问)。

    3 回复  |  直到 12 年前
        1
  •  10
  •   sepp2k    15 年前

    一种方法是:

    1. 对列表排序。
    2. 用它的尾巴把清单拉上拉链。 [1,1,2,3] 进入之内 [(1,1),(1,2),(2,3)]
    3. 删除两个项目相同的所有对。
    4. 返回包含排序列表的第一个元素的列表,后跟压缩列表中每对的第二个项目。

    在代码中:

    import Data.List
    
    setify [] = []
    setify xs = x : map snd (filter (uncurry (/=)) (zip sxs (tail sxs)))
        where sxs = sort xs
              x   = head sxs
    
        2
  •  4
  •   sabauma    15 年前

    setify :: (Eq b) => [b] -> [b]
    setify = foldl f []
    where f acc next | next `elem` acc = acc 
                     | otherwise       = next:acc
    

        3
  •  0
  •   Imrul    6 年前

    你可以用吗 group 方法?如果是这样,那么您可以对列表进行排序、分组,最后从每组中提取1项。

    import Data.List
    
    setify :: Eq a => [a] -> [a]
    setify = map head . group . sort
    
        4
  •  -1
  •   Evi1M4chine    14 年前

    为什么这么复杂(而且错!)解决?就这么做吧:

    uniq [] = []
    uniq (x:xs)= x:(uniq (filter (/=x) xs))
    
    setify xs = uniq $ sort xs -- If you want to sort too.
    

    推荐文章