Jam*_*aga 4 haskell tuples list
如果这个问题非常简单,我很抱歉,但我很难找到答案很长一段时间,这就是我决定在这里发布的原因.
我想构建一个函数,它接受二进制元组列表:[(Integer,Integer)]并从所有元组的所有第二个整数中输出最大的Integer.我写了以下代码:
maxSecond:: [(Integer,Integer)] -> Integer
maxSecond [(ks, as)] = aux (unzip [(ks, as)])
where aux ([ks],[as]) = maximum ([as])
Run Code Online (Sandbox Code Playgroud)
但它只有在我输入一个只有1个元组的列表并且输出"功能中的非穷举模式"错误才能生成超过2个元组的列表时才有效.我的问题不是如何真正解决原始问题,为什么这样的方法在Haskell中不起作用?
我还写了以下函数:
aaa:: ([Integer], [Integer]) -> Integer
aaa ([as],[ms]) = 10
Run Code Online (Sandbox Code Playgroud)
显然,在Haskell中输入一个列表元组是不可能的(除非列表不是由1个元素组成).这有什么解释吗?
谢谢!!
初学者Haskell程序员犯的一个常见错误是他们认为这[x]是一个匹配任何长度列表的模式.但[x]实际上是一个匹配单例列表的模式(一个列表只包含一个元素,并且该元素与"链接" x).
如果我们希望能够处理空列表([])或非空列表(长度大于零),我们可以只写为模式x,x而不是"链接"到该列表本身.请注意,我们可以使用我们想要的任何标识符 列表的模式匹配当然是有用的:例如,处理空列表的情况,缺点,包含正好一个,两个,三个,五个等元素的列表.但在这里,我们只会限制自己,使事情变得更加复杂.
为了计算元组的第二项的最大值,我们可以通过首先进行map生成元素列表的ping 来处理它,每个元素都是相应元组的第二项,然后我们可以计算该maximum列表的列表,如:
maxSecond :: Ord a => [(a, a)] -> a
maxSecond xs = maximum (map snd xs)
Run Code Online (Sandbox Code Playgroud)
因此,我们使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |