List 带元组的Haskell类型
这个问题特别关注元组列表 我用List 带元组的Haskell类型,list,haskell,types,tuples,List,Haskell,Types,Tuples,这个问题特别关注元组列表 我用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'),
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总是有一些我不知道的语法),但我不确定这是否适用于其他(可折叠的t,Ord a)=>TA
类型,也不确定这是否是一个更通用的特性
Haskell如何处理
(a,b)
类型的元组,以便f:([a]->[c])
可以应用于l:[(a,b)]
?这种方法是否适用于其他数据结构,或者更像是列表?简短回答
这里没有任何魔力。这是因为您考虑的函数是sort::Ord a=>[a]->[a]
和minimum::(可折叠的t,Ord a)=>ta->a
。在这里您可以看到上下文Ord a
,在您的例子中,这个a
是一个元组(a,b)
。元组(Ord a,Ord b)=>Ord(a,b)
有一个实例。这就是为什么您可以执行(1,3)<(2,4)
。这就是它起作用的原因。此函数将与列表(可能是一个
)一起使用
any
具有类型Foldable t=>(a->Bool)->ta->Bool
,它可以处理元组列表。例如,像这样:
any(==1.fst)[(1,3)、(2,4)、(3,5)]
但事实并非如此:
any(=1)[(1,3)、(2,4)、(3,5)]
元组是按字典顺序排列的Ord
ered:首先比较第一个组件。在平局中,比较第二个分量,依此类推。所以元组列表是有序元素的列表,并且可以排序。您可能会喜欢我讨论的如何在两人游戏中读取类型。在该答案中使用的术语中:sort::forall a的调用方。Ord a=>[a]->[a]
选择a
作为(Int,Char)
,然后提供证据证明(Int,Char)
是Ord
的实例。类型变量可以被实例化为任何(单态)类型,包括Int
和元组、列表、树和Bool
s以及漂浮在船上的任何类型。