Haskell 程序获取一个成对的列表,并按从小到大的顺序返回

Haskell 程序获取一个成对的列表,并按从小到大的顺序返回,haskell,Haskell,因此,我编写了这个程序,其中它获取一个键值列表,并返回具有最大值的一对,现在我希望程序返回原始列表,但首先以最小值组织,最后以最大值组织,例如[(4,3),(2,10),(2,1)]->它返回[(2,1),(4,3),(2,10)] vector :: Ord a => [(t, a)] -> (t, a) vector (x:xs) = maxTail x xs where maxTail currentMax [] = currentMax maxTail (

因此,我编写了这个程序,其中它获取一个键值列表,并返回具有最大值的一对,现在我希望程序返回原始列表,但首先以最小值组织,最后以最大值组织,例如[(4,3),(2,10),(2,1)]->它返回[(2,1),(4,3),(2,10)]

vector :: Ord a => [(t, a)] -> (t, a)
vector (x:xs) = maxTail x xs
  where maxTail currentMax [] = currentMax
        maxTail (m, n) (p:ps)
          | n < (snd p) = maxTail p ps
          | otherwise = maxTail (m, n) ps

现在,如果有两个值彼此相等,我希望程序根据键排序,例如[(42,3),(3,3),(4,1)]->[(4,1),(3,3),(42,3)] 这就是我所做的

import Data.List (sortOn)

sortOnSnd :: Ord a => [(a, b)] -> [(a, b)]
sortOnSnd = sortOn snd 
if sortOn snd == sortOn snd then sortOn fst 
它给出了主IO函数中的错误首先,是什么让您想到将此函数称为“向量”是个好主意??让我们来做吧

import Data.List (sortOn)

sortOnSnd :: Ord a => [(a, b)] -> [(a, b)]
sortOnSnd = sortOn snd 
import Data.List (maximumBy)
import Data.List (comparing)

maximumOnSnd :: Ord a => [(t, a)] -> (t, a)
maximumOnSnd = maximumBy $ comparing snd
现在,您可以使用它来实现,但它的效率会非常低——不仅因为它是一个O(n2)算法,还因为它需要一些不必要的额外列表遍历。特别是,仅仅找到最高元素是不够的,实际上需要提取它。一种可能性(效率低且不可靠)是过滤掉您发现的:

extrMaximumOnSnd :: (Ord a, Eq t) => [(t, a)] -> ((t, a), [(t, a)])
extrMaximumOnSnd l = (maxMember, filter (/=maxMember) l)
 where maxMember = maximumOnSnd l
因此,您可以递归地实现选择排序:

sortOnSnd :: (Ord a, Eq t) => [(t, a)] -> [(t, a)]
sortOnSnd [] = []
sortOnSnd l = case extrMaximumOnSnd l of
     (maxMember, others) -> sortOnSnd ++ [maxMember]
但请再次记住,这是非常低效的,没有一般性的(
Eq t
constraint)和不可靠的,尤其是当列表包含重复元素时

一个更好的解决方案是

import Data.List (sortOn)

sortOnSnd :: Ord a => [(t, a)] -> [(t, a)]
sortOnSnd = sortOn snd

谢谢,现在有一种情况,如果两个值相同。。然后将它们作为键排序,例如[(4,3),(2,3),(10,5)]->[(2,3),(4,3),(10,5)]。我在最后一个函数中添加了这一行,但它在main::IO中给出了一个错误,其中如果sortOn snd==sortOn snd,那么sortOn fstTry
sortOn swap
。无需明确区分大小写。
比较
在Data.Ord中
import Data.List (sortOn)

sortOnSnd :: Ord a => [(t, a)] -> [(t, a)]
sortOnSnd = sortOn snd