Ошибка с очень простой реализацией списка Max с использованием Fold

Я пытаюсь реализовать max'

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

с помощью foldl (К сожалению, у LYAH, похоже, нет упражнений, поэтому я их придумываю).

Итак, я могу написать лямбду, беру два целых числа и возвращая максимум:

(\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 ответ

Обратите внимание, что вы реализуете maximum не макс, который вы также можете использовать

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'
Другие вопросы по тегам