Как удалить все вхождения значения из списка в haskell с помощью Prelude? - PullRequest
3 голосов
/ 26 августа 2009

Я хочу удалить каждое вхождение определенного значения из списка. Я написал функцию для этого:

removeall val [] = []
removeall val list = if (head list) == val
                     then removeall val (tail list)
                     else (head list):(removeall val (tail list))

но я бы хотел использовать Prelude, если это возможно, из соображений элегантности и читабельности.

Ответы [ 4 ]

24 голосов
/ 26 августа 2009
removeall = filter . (/=)
19 голосов
/ 26 августа 2009
removeall val list = filter (/= val) list
2 голосов
/ 26 августа 2009

Также работает следующее

removeall val list = [ x | x <- list, x /= val ]
1 голос
/ 27 августа 2009

Это просто ваша перезапись, которая удаляет вызовы функций головы и хвоста.

removeall val [] = []
removeall val (x:xs) = if (x == val) 
                         then removeall val xs 
                         else x:removeall val xs

Лично я предпочитаю

removeall = filter . (/=)

один, данный другими, но начинающему может быть сложнее быстро понять.

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