List Haskell按匹配值重新排序列表

List Haskell按匹配值重新排序列表,list,haskell,List,Haskell,我想知道是否有一种有效/简单的方法可以通过匹配另一个设置顺序的列表的值来重新排序中的列表。更具体地说,如果我有以下列表: [["a", "1", "2"], ["b", "2", "3"]] ["b", "a"] 我想按以下清单订购: [["a", "1", "2"], ["b", "2", "3"]] ["b", "a"] 生成新排序的列表: [["b", "2", "3"], ["a", "1", "2"]] 有人知道如何做到这一点吗 提前谢谢 致以最良好的祝愿, Skyfe.基本

我想知道是否有一种有效/简单的方法可以通过匹配另一个设置顺序的列表的值来重新排序中的列表。更具体地说,如果我有以下列表:

[["a", "1", "2"], ["b", "2", "3"]]
["b", "a"]
我想按以下清单订购:

[["a", "1", "2"], ["b", "2", "3"]]
["b", "a"]
生成新排序的列表:

[["b", "2", "3"], ["a", "1", "2"]]
有人知道如何做到这一点吗

提前谢谢

致以最良好的祝愿,
Skyfe.

基本上,它通过提供特殊的订购功能来工作

import Data.List
import Data.Ord
byLoc :: Eq a => [a] -> -- The list that we're sorting by
                 [a] -> -- First list
                 [a] -> -- Second list
                 Ordering
byLoc ords = comparing (elemIndex . head)
比较
使用一个函数,该函数接收两个列表,并在排序列表中查找每个列表的第一个元素,比较位置

那么我们只有

sortLoc ords = sortBy (byLoc ords)
我们完成了。不幸的是,这真的很慢

更快的解决方案是

import Data.Maybe
import Data.List
sortLoc ords xs = mapMaybe lookup ords
  where lookup e = find ((==e) . head) xs
这里我们只是在
mappaye
中查找列表中的适当元素。如果找不到元素,我们就跳过它

或者,如果要支持具有相同键的多个元素

sortLoc ords xs = mapConcat lookup ords
  where lookup e = filter ((==e) . head) xs

第二个列表如何设置第一个列表的顺序的规则是什么?看起来您希望第二个列表中的每个元素都代表第一个列表中一个子列表的第一个元素,但我不确定。请澄清。是的,没错,第二个列表中的元素指定了第一个列表中的第一个子列表。jozefg提供的解决方案满足了这一要求