Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 带元组的Haskell类型_List_Haskell_Types_Tuples - Fatal编程技术网

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以及漂浮在船上的任何类型。