Избыточное, если предупреждение о предупреждении в haskell - PullRequest
4 голосов
/ 08 ноября 2011

Итак, я следую учебному пособию Изучаю вас на 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)

Iдумаю, я просто новичок в Haskell и не вижу очевидного решения.Может кто-нибудь сказать мне, что изменение кода будет держать функцию работать правильно, и все же удалить предупреждение компилятора?

Ответы [ 2 ]

10 голосов
/ 08 ноября 2011

if x == y then True else acc совпадает с x == y || acc.

4 голосов
/ 08 ноября 2011

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

У него правильный тип!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...