使用折叠非常简单地实现List Max的错误

时间:2016-04-08 18:58:15

标签: haskell fold

我正在尝试实施max'

max' :: (Ord a) => [a] -> a

使用foldl(可悲的是,LYAH似乎没有练习,所以我正在制作它们。)

所以,我可以写一个带有两个整数的lambda并返回最大值:

(\x y -> if x > y then x else y) 2 3

我可以foldl使用它的列表:

foldl (\x y -> if x > y then x else y) 2 [2, 3, 4, 1]

所以我认为我需要的是:

max' :: (Ord a) => [a] -> a
max' xs = foldl (\x y -> if x > y then x else y) (head xs) (tail xs)

但上述行失败了:

    Use foldl1
Found:

foldl (\ x y -> if x > y then x else y) (head xs) (tail xs)
Why Not:

foldl1 (\ x y -> if x > y then x else y) xs

我想问:

  1. 在这种情况下有什么问题?

  2. 如何从此类消息中找出未来的错误?

1 个答案:

答案 0 :(得分:3)

请注意您重新实现maximum not max,您也可以使用

foldl max (head xs) (tail xs)


Prelude> :info max
class Eq a => Ord a where
  ...
  max :: a -> a -> a
  ...
        -- Defined in `GHC.Classes'

Prelude> :info maximum
maximum :: Ord a => [a] -> a    -- Defined in `Data.List'