【问题标题】:Haskell type with tuples带元组的 Haskell 类型
【发布时间】: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 以及任何漂浮的东西。

标签: list haskell types tuples


【解决方案1】:

简答

这里没有任何魔法。那是因为您考虑的函数是sort :: Ord a => [a] -> [a] 和minimum :: (Foldable t, Ord a) => t a -> a。在这里您可以看到上下文Ord a,在您的情况下,这个a 是一个元组(a, b)。有元组(Ord a, Ord b) => Ord (a, b) 的实例。这就是为什么你可以执行(1,3) < (2,4)。这就是它起作用的原因。例如,此函数将适用于Maybe a 的列表。

any 的类型为Foldable t => (a -> Bool) -> t a -> Bool,它可以与元组列表一起使用。比如像这样:

any ((== 1) . fst) [(1,3), (2,4), (3,5)]

但并非如此:

any (== 1) [(1,3), (2,4), (3,5)]

【讨论】:

    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多