如果这个问题非常简单,我很抱歉,但我很难找到答案很长一段时间,这就是我决定在这里发布的原因 .
我想构建一个函数,它接受二进制元组列表:[(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 回答
初学者Haskell程序员犯的一个常见错误是他们认为
[x]
是一个匹配任何长度列表的模式 . 但是[x]
实际上是一个匹配单例列表的模式(一个列表只包含一个元素,该元素是"linked"到x
) .如果我们希望能够处理空列表(
[]
)或非空列表(长度大于零),我们可以写为模式x
,x
将比将"linked"写入该列表本身 . 请注意,我们可以使用我们想要的任何标识符列表的模式匹配当然是有用的:例如,处理空列表的情况,缺点,包含正好一个,两个,三个,五个等元素的列表 . 但在这里,我们只会限制自己,使事情变得更加复杂 .为了计算元组的第二项的最大值,我们可以通过首先生成
map
ping来生成元素列表,每个元素都是相应元组的第二项,然后我们可以计算该列表的maximum
来处理它 . , 喜欢:因此,我们使用map :: (a -> b) -> [a] -> [b]函数将函数应用于列表
xs
中的所有元素,该函数是snd :: (c, d) -> d,因此获取2元组的第二个元素,然后我们计算maximum :: Ord e => [e] -> e以获得该列表的最大值 .我们也可以使用(.) :: (b -> c) -> (a -> b) -> a -> c运算符,并将它写成: