2012-05-04 7 views
3

У меня есть эта функция, которая удаляет вхождения данного элемента в список списков.Удаляет вхождения данного элемента в список списков

remove   :: Eq a => a -> [[a]] -> [[a]] 
remove y [] = error "Can't remove an element from an empty list" 
remove y xs = map (filter(/=y)) xs 

Как я мог бы сделать то же с использованием списка постижение

Спасибо вам

+0

Почему 'remove y []' ошибка, когда, например, 'remove y [[]]' и 'remove y [[y + 1]]' не являются ошибками? – dave4420

+0

Спасибо dave Я добавлю эти erros Спасибо :) – Moe

+5

@Mike: вы не должны делать ошибки. Если вы удаляете 'y' из пустого списка, он остается пустым списком ... в этом случае функция должна быть полной, ошибки будут только затруднять ее использование. –

ответ

5

Для каждого l в xs, добавьте filter (/= xs) l к полученному списку:

remove y xs = [filter (/= y) l | l <- xs] 

или удаление фильтра гнездящихся постижений. Для каждого xs в xss и для каждого x в xs, держать x только если он отличается от y:

remove y xss = [ [x| x <- xs, x /= y] | xs <- xss] 

Это нормально, если вы просто практиковать, но ваша версия с map это лучше :)

2

Я думаю, что-то вдоль линий:

remove y ls = [f|l <- ls, let f = filter (/= y) l] 

должно быть хорошо.

В нем говорится, что для каждой привязки l вы можете сделать в списке ls, добавить отфильтрованный список f в результирующий список.

+0

Спасибо, что это здорово, может объяснить это кратко, если не так много спросить. – Moe

+0

@Mike: см. Ответ Риккардо, это лучше:] – m09

+0

@Mike: Я добавил короткое объяснение – m09

Смежные вопросы