【问题标题】:A function of tuple of lists列表元组的函数
【发布时间】:2019-02-23 23:54:47
【问题描述】:

如果这个问题非常琐碎,我很抱歉,但我已经努力寻找答案很长一段时间了,这就是我决定在这里发布它的原因。

我想构建一个函数,它采用二进制元组列表:[(Integer, Integer)] 并从所有元组的所有第二个整数中输出最大整数。我写了以下代码:

maxSecond:: [(Integer,Integer)] -> Integer
maxSecond [(ks, as)] = aux (unzip [(ks, as)])
  where aux ([ks],[as]) = maximum ([as])

但只有当我输入一个只有 1 个元组的列表并为超过 2 个元组的列表输出“函数中的非详尽模式”错误时它才有效。我的问题不是如何实际解决原始问题,而是为什么这种方法在 Haskell 中不起作用?

我还写了如下函数:

aaa:: ([Integer], [Integer]) -> Integer
aaa ([as],[ms]) = 10

显然不可能在 Haskell 中输入列表元组(除非列表不是由 1 个元素组成的)。有什么解释吗?

谢谢!!

【问题讨论】:

  • 提示:一个常见的错误是人们认为[x] 表示这是any 列表(任意长度),但[x] 模式匹配singleton 列表,作为元素 x.

标签: list haskell tuples


【解决方案1】:

Haskell 初学者常犯的一个错误是他们认为[x] 是一个匹配任意长度列表的模式。但[x] 实际上是一个匹配 singleton 列表的模式(一个恰好有 one 元素的列表,并且该元素“链接”到x)。

如果我们希望能够处理空列表([])或非空列表(长度大于零),我们可以写成模式xx will than get "linked “到那个列表本身。请注意,我们可以使用任何我们想要的标识符。列表的模式匹配当然很有用:例如,处理空列表、cons、恰好包含一、二、三、五等元素的列表的情况。但在这里我们只会限制自己,让事情变得更复杂。

为了计算元组第二项的最大值,我们可以先做一个mapping,生成一个元素列表,每个元素对应元组的第二项,然后我们可以计算该列表的maximum,例如:

maxSecond :: Ord a => [(a, a)] -> a
maxSecond xs = maximum (map snd xs)

因此,我们在这里使用map :: (a -> b) -> [a] -> [b] 函数将函数应用于列表xs 中的所有元素,该函数是snd :: (c, d) -> d,因此采用2 元组的第二个元素,然后我们计算maximum :: Ord e => [e] -> e 获取该列表的最大值。

我们也可以使用(.) :: (b -> c) -> (a -> b) -> a -> c操作符,写成这样:

maxSecond :: Ord a => [(a, a)] -> a
maxSecond = maximum . map snd

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多