我有一个包含我要排序的元组的列表,以便它们包含的值按字母顺序显示。我玩弄了Data.List-sorting,但只设法对列表进行排序,而不是元组的值。
实质上,有没有办法改变
列表[("foo","bar"),("stack","overflow"),("help","please")]
进入列表
[("bar","foo"),("overflow","stack"),("help","please")]
答案 0 :(得分:3)
元组只能是有序的或反向的,因为它总是只有两个元素,所以这些是唯一的排列。因此,您只需要检查是哪种情况,并在必要时翻转元组一次。
sortTuple :: Ord a => (a,a) -> (a,a)
sortTuple (x,y)
| x>y = ...
| otherwise = ...
此问题与列表无关,因为您只是将操作独立应用于每个元素
sortTuplesInList :: Ord a => [(a,a)] -> [(a,a)]
sortTuplesInList = map sortTuple
答案 1 :(得分:1)
虽然元组的长度可以变化(我认为最多64个元素),但是包装列表必须是同质的(即所有元组元素都具有相同的长度)。这使得使用列表理解之类的东西变得容易:
import Data.List
let sortedPairs = [(x,y) | [x,y] <- tmp]
where tmp = [sort [x,y] | (x,y) <- [("m","l"),("p","q"),("s","r")]]
您可以调整元组的大小(以及模式匹配中的变量)以适合您的域。
希望这有帮助。