【发布时间】:2021-04-27 04:46:31
【问题描述】:
这个问题专门针对元组列表。
我使用sort 对元组列表进行排序;起初我认为 ghci 会引发错误或其他问题,但我收到了一个基于元组第一个元素的排序列表!
Prelude Data.List> :t sort
sort :: Ord a => [a] -> [a]
Prelude Data.List> sort [3,1,2]
[1,2,3]
Prelude Data.List> sort [(3,'c'), (1,'a'),(2,'b')]
[(1,'a'),(2,'b'),(3,'c')]
Prelude Data.List> sort [(3,'c',1), (1,'a',2),(2,'b',3)]
[(1,'a',2),(2,'b',3),(3,'c',1)]
同样的情况也发生在像 minimum 这样具有类似行为的函数上,但对于像 any 这样的函数则不然。所以我猜这是一个语法糖(Haskell 总是有一些我不知道的语法),但我不确定这是否适用于其他 (Foldable t, Ord a) => t a 类型,也不确定这是否是一个更通用的功能。
Haskell 如何处理(a,b) 类型的元组以便f :: ([a] -> [c]) 可以应用于 l :: [(a, b)]?这种方式是否适用于其他数据结构,或者这更像是仅列表?
【问题讨论】:
-
元组按字典顺序排列
Ordered:首先比较第一个组件。在平局上,比较第二个组件,依此类推。所以元组列表是有序元素的列表,可以排序。 -
您可能会喜欢我在Why can a Num act like a Fractional? 中关于如何将类型解读为两人游戏的讨论。在该答案中使用的术语中:
sort :: forall a. Ord a => [a] -> [a]的调用者选择a为(Int, Char),然后提供证据证明(Int, Char)是Ord的一个实例。类型变量可以被实例化为 any(单态)类型,包括Int和元组、列表和树以及Bools 以及任何漂浮的东西。