Haskell - 按整数值对带有字符串的列表进行排序的函数
Posted
技术标签:
【中文标题】Haskell - 按整数值对带有字符串的列表进行排序的函数【英文标题】:Haskell - function that sorts list with strings by integer value 【发布时间】:2022-01-18 00:19:27 【问题描述】:以下是我当前按升序对列表进行排序的代码:
qsort::[Int]->[Int]
qsort[]=[]
qsort(x:xs)
=qsort[y|y<-xs, y<=x]++[x]++qsort[y|y<-xs,y>x]
我将如何修改/创建一个对列表进行排序的函数,例如:
[("Bob",22),("Peter",38),("Charlie",19)]
通过 int 值
【问题讨论】:
您的代码将变得更加可读,只需在此处和那里添加几个空格! 【参考方案1】:您可以将项目解包为 2 元组:
qsort::[Int] -> [Int]
qsort [] = []
qsort(x@(_,vx):xs) = qsort [ y | y@(_, vy) <-xs, … ] ++ [x] ++ qsort [ y | y@(_, vy) <- xs, … ]
这里还需要填写…
部分。 vx
是 x
的值,vy
是元素 y
的值。因此,您需要在vx
和vy
之间进行比较。
【讨论】:
谢谢.. 只是尝试按照您的代码进行操作,因此 ... 填写的部分将是 vyvx? @John:是的,没错!【参考方案2】:这是一个可能的策略。首先,定义一个自定义的“小于等于”运算符
lte :: (String, Int) -> (String, Int) -> Bool
lte (str1, int1) (str2, int2) = ...
然后,调整您的qsort
实现,将<=
的每次使用替换为对lte
的调用,并将>
的每次使用替换为对lte
的调用的否定 .
【讨论】:
【参考方案3】:升序
test = sortBy (compare `on` snd) [("Bob",22),("Peter",38),("Charlie",19)]
降序
test = sortBy (flip compare `on` snd) [("Bob",22),("Peter",38),("Charlie",19)]
交替下降,
import Data.Function (on)
import Data.Ord (Down(Down))
test = sortOn Down [("Bob",22),("Peter",38),("Charlie",19)]
【讨论】:
以上是关于Haskell - 按整数值对带有字符串的列表进行排序的函数的主要内容,如果未能解决你的问题,请参考以下文章