Как отфильтровать элементы списка в Haskell на основе предыдущего значения в списке? - PullRequest
2 голосов
/ 04 ноября 2019

Я работаю над созданием в Haskell функции, которая фильтрует номера списка по условию на основе предыдущего элемента в списке.

Пример

предыдущее число являетсякратный 2

myFunction [1, 2, 5, 6, 3]
# expected output:
[5,3]

Я знаю, как применить filter, но до сих пор я видел, что фильтры принимают только один аргумент за раз.

Я пытался с scanl1,foldl1 и map но я новичок в Хаскеле и не смог этого сделать;какая-нибудь подсказка?

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Редактировать

Должно быть:

myFunction []       =  []
myFunction [x]      =  []
myFunction [x,y]    =  if (x `mod` 2) == 0 then [y] else []
myFunction (x:y:xs) =  if (x `mod` 2) == 0 
                      then y : (myFunction xs)
                      else myFunction (y:xs)

, потому что для входа:

myFuntion [1, 2, 5, 6, 3]

правильный вывод должен быть:

[5,3]
2 голосов
/ 04 ноября 2019

Если вы предпочитаете использовать библиотечные функции, для подобных ситуаций существует известная хитрость, заключающаяся в том, чтобы заархивировать ввод своим хвостом, то есть начальным списком за вычетом его первого элемента.

 λ> 
 λ> inls = [1, 2, 5, 6, 3]
 λ> 
 λ> let pairs = zip (tail inls) inls
 λ> pairs
 [(2,1),(5,2),(6,5),(3,6)]
 λ> 

и итоговый список пар является легкой целью для map и filter. Как в:

λ> let myFunction ls = let pairs = zip (tail ls) ls  in  map fst $ filter (even . snd) pairs
λ> 
λ> ls
 [1,2,5,6,3]
λ> 
λ> myFunction ls
[5,3]
λ> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...