Избыточный, если предупреждение о предупреждении в 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 ответа

Решение

if x == y then True else acc такой же как x == y || acc,

Введите ваше последнее определение в 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

Это имеет правильный тип!

Другие вопросы по тегам