Хороший вопрос, и он не был задокументирован в Репа-учебнике , поэтому я обновил его новым разделом прохождения .
В частности, traverse
позволяет:
- изменять форму выходного массива
- индексировать любое значение
- наблюдать текущий элемент
Это означает, что вы можете делать такие вещи, как:
Заменить все элементы с указателем их строки
> traverse a id (\_ (Z :. i :. j :. k) -> i)
[0,0,0,0,0,0,0,0,0
,1,1,1,1,1,1,1,1,1
,2,2,2,2,2,2,2,2,2]
Умножить элемент на его строку
> traverse a id (\f (Z :. i :. j :. k) -> f (Z :. i :. j :. k) * i)
[0,0,0,0,0,0,0,0,0
,10,11,12,13,14,15,16,17,18
,38,40,42,44,46,48,50,52,54]
И так далее.travese
очень мощный и магически параллельный.
Advanced: параллельная десатурация изображения
Пример из учебника Repa