TL; DR - это решение (на основе этого ответа ), на которое ссылался Томас М. Дюбюссон в своем комментарии. Упс.
Вам даже не нужно явно перебирать ввод. Представьте, что у вас есть список функций fs = [f0, f1, f2, ...]
и список значений xs = [x0, x1, x2, ...]
, и вы хотите получить [f0 x0, f1 x1, f2 x2, ...]
. Вы делаете это с помощью zipWith ($)
:
zipWith ($) fs xs -- == [f0 $ x0, f1 $ x1, f2 $ x2, ...]
-- == [f0 x0, f1 x1, f2 x2, ...]
Для вашей задачи ваша fs
будет представлять собой чередующуюся последовательность reverse
и id
, которую вы можете создать с помощью cycle [reverse, id] == [reverse, id, reverse, id, ...]
Если сложить это вместе,
f :: [String] -> [String]
f strings = zipWith ($) (cycle [reverse, id]) strings
-- == [reverse strings0, id strings0, reverse strings2, id strings3, ...]
или просто
f :: [String] -> [String]
f = zipWith ($) (cycle [reverse, id])