首页 文章

列表元组的功能

提问于
浏览
4

如果这个问题非常简单,我很抱歉,但我很难找到答案很长一段时间,这就是我决定在这里发布的原因 .

我想构建一个函数,它接受二进制元组列表:[(Integer,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个元素组成) . 这有什么解释吗?

谢谢!!

1 回答

  • 6

    初学者Haskell程序员犯的一个常见错误是他们认为 [x] 是一个匹配任何长度列表的模式 . 但是 [x] 实际上是一个匹配单例列表的模式(一个列表只包含一个元素,该元素是"linked"到 x ) .

    如果我们希望能够处理空列表( [] )或非空列表(长度大于零),我们可以写为模式 xx 将比将"linked"写入该列表本身 . 请注意,我们可以使用我们想要的任何标识符列表的模式匹配当然是有用的:例如,处理空列表的情况,缺点,包含正好一个,两个,三个,五个等元素的列表 . 但在这里,我们只会限制自己,使事情变得更加复杂 .

    为了计算元组的第二项的最大值,我们可以通过首先生成 map ping来生成元素列表,每个元素都是相应元组的第二项,然后我们可以计算该列表的 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
    

相关问题