Ошибка с очень простой реализацией списка 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 ответ
Обратите внимание, что вы реализуете 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'