我刚刚开始学习Haskell。据我所知,maximum
给出了整数列表的最大值。因此,maximum [2,5,7,1]
给出7。但是为什么通过给出元组输入,max总是给出第二个元素?例如,maximum (8,1)
给1同样的事情发生的sum (8,1)
,product (5,2)
,minimum (4,5)
...所有给出的元组的第二个元素。因此,有人可以向初学者解释为什么会发生这种情况吗?
简短答案:对于2元组,Foldable
实例仅考虑第二项。maximum
因此,该函数将始终返回2元组的第二项。
因为2元组是的实例Foldable
。实际上,它定义为[src]:
instance Foldable ((,) a) where foldMap f (_, y) = f y foldr f z (_, y) = f y z
在maximum
本质上是一个foldr相似的模式。它的实现等效于:
maximum = foldr1 max
在哪里foldr1
实现为:
foldr1 f = fromMaybe (error "…") . foldr mf Nothing where mf x m = Just (case m of Nothing -> x Just y -> f x y)
因此,对于2元组,它将实现为:
maximum (_, y) = fromMaybe (error "…") (mf y Nothing) where mf x m = Just (case m of Nothing -> x Just y -> max x y)
因此,这里我们mf
用y
(作为x
参数)和Nothing
作为调用m
。在case … of …
这个用火柴Nothing
和回报x
。因此,两个元组的最大值定义为:
maximum (_, y) = fromMaybe (error "…") (Just y)
因此更短:
-- maximum for a (a, b) maximum (_, y) = y