Haskell 有人能解释一下下面的代码是如何工作的吗?

Haskell 有人能解释一下下面的代码是如何工作的吗?,haskell,Haskell,我不知道两个递归(myMaximumBy)是如何一起工作的,我试图在纸上画一个图表,但我被卡住了。例如,myMaximumBy比较[1,5,2,4,3] myMaximumBy :: (a -> a -> Ordering) -> [a] -> a myMaximumBy _ (x:[]) = x myMaximumBy f (x:xs) = if (f x (myMaximumBy f xs)) == GT then x else (myMaximumBy f xs)

我不知道两个递归(myMaximumBy)是如何一起工作的,我试图在纸上画一个图表,但我被卡住了。例如,myMaximumBy比较[1,5,2,4,3]

myMaximumBy :: (a -> a -> Ordering) -> [a] -> a
myMaximumBy _ (x:[]) = x
myMaximumBy f (x:xs) = if (f x (myMaximumBy f xs)) == GT then x else (myMaximumBy f xs)

基本上,您遍历整个列表,直到碰到单个元素x(第一行)。因为x是唯一的元素,所以它必须是最大值

现在,您将反向检查每个元素y与x:如果y大于x(第一种情况),则继续使用y作为最大值,否则保留x(第二种情况)

我将使用
maxBy
来说明这一点,而不是在if子句中使用您的定义:

maximumBy f [x] = x
maximumBy f (x:xs) = maxBy f x (maximumBy f xs)

maxBy f x y | f x y == GT = x
            | otherwise   = y

这个定义等同于你的定义

例如:

maximumBy (comparing abs) [2,5,-3,1]
== maxBy (comparing abs) 2 (maxBy (comparing abs) 5 (maxBy (comparing abs) -3 (maximumBy (comparing abs) [1])))
== maxBy (comparing abs) 2 (maxBy (comparing abs) 5 (maxBy (comparing abs) -3 1))
== maxBy (comparing abs) 2 (maxBy (comparing abs) 5 -3)
== maxBy (comparing abs) 2 5
== 5

“此定义与您的定义相同”,只是它只需要对
f
的线性调用数,而OP的实现对
f
的调用数是最坏情况下的指数。。。