使用代理顺序对无序列表进行Haskell排序
假设我有使用代理顺序对无序列表进行Haskell排序,haskell,sorting,Haskell,Sorting,假设我有x::[(n,a)]其中n是一个数字,a是一个无序项(不属于Ord类) 我想把这个列表按n排序 我无法执行排序x,因为a不可排序。我可以用索引替换a,然后使用组合新列表但这似乎是一个糟糕的解决方案 替代品?啊。没关系按所需排序 sortBy (compare `on` fst) 或者类似的东西。 您将在模块数据.Function中定义的,以及数据.List中定义的中找到需要导入的。此外,如果您有一个备用函数(例如,称之为f)来形成订单,您可以使用订单的数据。订单的Monoid属性: s
x::[(n,a)]
其中n是一个数字,a是一个无序项(不属于Ord类)
我想把这个列表按n排序
我无法执行排序x
,因为a
不可排序。我可以用索引替换a
,然后使用组合新列表代码>但这似乎是一个糟糕的解决方案
替代品?啊。没关系<代码>按所需排序
sortBy (compare `on` fst)
或者类似的东西。
您将在模块数据.Function
中定义的,以及数据.List
中定义的中找到需要导入的。此外,如果您有一个备用函数(例如,称之为f
)来形成订单,您可以使用订单的数据。订单的Monoid属性:
sortBy (comparing fst `mappend` comparing (f . snd))
这将在该对的第二个组件上使用您的函数。如果您不需要或没有第二个标准来对成对进行排序,那么sortBy(比较fst)
就可以了(结果列表将只包含具有相同列表顺序的第一个组件的成对)。不仅仅是sortBy
,而是sortBy(比较fst)
(以防您从未听说过比较
功能)。比较
位于Data.Ord
中(但您知道这一点,因为您使用了hoogle。)?酷,每次我需要知道函数的位置时,我总是问尼尔·米切尔……作为跟进,更传统的用法是利用定义:comparing=on compare不反驳技术高超的拉姆齐博士,只是指出一种更常见的风格。@BMpeh不要给我比我更多的信任rth.我从别人那里学到了关于比较的,
,我很高兴从你那里学到了比较的。(保持答案不变,以免读者陷入绝望的困惑。)