在haskell的排序函数中使用groupBy的替代方法

5vf7fwbs  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(164)

我想实现一个排序函数,它将对字符串列表中的元素进行排序,并删除所有重复项。
我已经编写了一个运行良好的函数:

import Data.List(sortBy, sort, groupBy)

cData :: [String]
cData = ["Blue", "Red", "Yellow",
           "Blue", "Yellow", "Blue",
           "Yellow", "Red", "Blue"]

uniqueColours :: (Ord a) => [a] -> [a]
uniqueColours xs = map head (groupBy (==)(sort xs))

uniqueColours cData = ["Blue","Red","Yellow"]

现在我的问题是。我如何实现相同的功能,而不使用“groupBy”,只使用“sort”和“sortBy”,也会给予相同的输出?这可能吗?这不是效率的问题,我想理解“sortBy”,我似乎没有正确实现。

mxg2im7a

mxg2im7a1#

列表的递归可以让你很容易地考虑列表的前两个元素和尾部。然后你只需要弄清楚在每种情况下该做什么。在空列表或只有一个元素的列表中,答案是显而易见的:该列表已经是“唯一”。
如果列表中至少有两个元素,如果前两个元素相同,你会怎么做?如果它们 * 不 *,你会怎么做?

unique :: Eq a => [a] -> [a]
unique [] = []
unique [x] = [x]
unique (a:tl@(b:_)) 
  | a == b = ...
  | otherwise = ...

相关问题