gpt4 book ai didi

haskell - 为什么在 Haskell 中最大值 (8,1) = 1?

转载 作者:行者123 更新时间:2023-12-02 11:19:17 24 4
gpt4 key购买 nike

我刚刚开始学习 Haskell。据我所知maximum给出整数列表的最大值.所以,maximum [2,5,7,1]给出 7。但是为什么通过给出元组输入,maximum 总是给出第二个元素?例如,maximum (8,1)给出 1。 sum (8,1) 也会发生同样的情况, product (5,2) , minimum (4,5) ...都给出了元组的第二个元素。那么,谁能向初学者解释为什么会发生这种情况?

最佳答案

简短回答:对于 2 元组,Foldable实例(仅)考虑第二项。 maximum因此,函数将始终返回 2 元组的第二项。

因为 2 元组是 Foldable 的一个实例。确实是defined as [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)

所以我们在这里打电话 mfy (作为 x 参数)和 Nothingmcase … of …这与 Nothing 匹配并返回x 。因此 2 元组的最大值定义为:

maximum (_, y) = fromMaybe (error "…") (Just y)

因此更短:

-- maximum for a (a, b)
maximum (_, y) = <b>y</b>

关于haskell - 为什么在 Haskell 中最大值 (8,1) = 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58728080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com