2014-10-16 2 views
0

У меня возникли проблемы с использованием списка в Haskell. Мой вопрос: как вы смотрите в списке при использовании понимания списка. Например: например, у меня есть список [1,2,3,4,5] как аргумент функции распознавания списка. Эта функция должна построить новый список из этого списка, но условие состоит в том, что, если следующий элемент тот же, то не включайте этот элемент в список.Забегая вперед в списках со списком осмысления

build [] = [] 
build list = [x | x <- list, (if current element equal next ignore)] 

Так что список [1,1,2,3,4,4,4] Выведет [1,2,3]

Любая помощь оценили

+6

почему не '[1,2,3,4]'? –

+1

Одним из способов было бы «zip» список с самим собой минус первый элемент. Однако для этого потребуется 'zip_longest' функция вместо' zip'. В python эта функция доступна, и поэтому вы можете написать '[x for x, y в zip_longest (xs, xs [1:]), если x! = Y]', однако я не думаю, что есть 'zip_longest' эквивалент в Haskell. По крайней мере, не полиморфный, который мог бы гарантировать правильные результаты (вы не можете использовать элемент списка в качестве значения по умолчанию в этом случае). – Bakuriu

+0

Как он должен вести себя с последним элементом списка (так как нет следующего элемента)? – shang

ответ

2

не включая 4 на выходе он, кажется, вы всегда сбросив последний элемент. Если это так это то, что вы ищете:

build xs = [x | (x,y) <- zip xs $ tail xs, x/=y] 
+0

Спасибо за предоставленное решение. Я думаю, что вы прояснили это для меня, потому что я смущался, что в понимании списка он ожидает bool или test. Я никогда не думал использовать методы, предоставленные вами или Sassa NF. –

1

Один лучше, если 4 должен был быть включен в пример (я не понимаю, почему нет):

build [] = [] 
build [email protected](x:_) = x:[y | (x:y:_) <- tails xs, x/=y]