Избыточный, если предупреждение о предупреждении в haskell
Итак, я следую учебному пособию " Учим вас на Haskell для хорошего блага"! и до сих пор я очень люблю Haskell. Но в одной из функций, упомянутых в руководстве, я получаю предупреждение о том, что оператор if является избыточным.
Редактировать: Позвольте мне прояснить, цель функции состоит в том, чтобы действовать точно так же, как работает функция elem (та, которая предоставляется по умолчанию в Haskell).
Вот оригинальная функция:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y ys = foldl (\acc x -> if x == y then True else acc) False ys
Первоначально было два предупреждения, одно было сокращением eta, поэтому я удалил ys из начала и конца имени функции, чтобы получить:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y = foldl (\acc x -> if x == y then True else acc) False
Теперь я попытался свести функцию к следующему, и это приводит к ошибке:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y = foldl (\acc x -> x == y)
Я думаю, что я просто новичок в Haskell и не вижу очевидного решения. Может кто-нибудь сказать мне, что изменение кода будет держать функцию работать правильно, и все же удалить предупреждение компилятора?
2 ответа
Введите ваше последнее определение в GHCi
без аннотации типа:
Prelude> let elem' y = foldl (\acc x -> x == y)
Prelude> :t elem'
elem' :: (Eq b) => b -> Bool -> [b] -> Bool
Это не соответствует вашему объявленному типу.
Вы забыли False
в конце! Если вы добавите его в:
Prelude> let elem' y = foldl (\acc x -> x == y) False -- note the False at the end
Prelude> :t elem'
elem' :: (Eq b) => b -> [b] -> Bool
Это имеет правильный тип!