Составьте два обхода с доступом только для чтения к среднему уровню - PullRequest
3 голосов
/ 07 мая 2020

Я хотел бы составить два обхода, а затем обойти композицию чем-то, что также зависит от «среднего» слоя.

Я думаю, это означало бы создание IndexedTraversal из двух Traversal s:

rememberMidpoint :: Traversal' s a -> Traversal' a b -> IndexedTraversal' a s b

Может быть, вопрос можно упростить до

remember :: Traversal' s a -> IndexedTraversal' s a a

или

remember :: Traversal' s a -> IndexedTraversal' a s a

?

Итак, мои вопросы:

  • Правильно ли я хочу использовать IndexedTraversal для этого?
  • Если да, то как мне реализовать rememberMidpoint или одну из двух remember функций + способ составить их результат с неиндексированным Traversal?

1 Ответ

1 голос
/ 07 мая 2020

@ phadej помог мне на # haskell -lens, указав мне на selfIndex:

Используйте само значение как собственный индекс. По сути, это индексированная версия id.

Вместе с комбинатором <. для составления индексированного и неиндексированного обхода мы получаем:

rememberMidpoint :: Traversal' s a -> Traversal' a b -> IndexedTraversal' a s b
rememberMidpoint outer inner = outer . selfIndex <. inner

И адресовать @ András Kovács точку в комментарии:

Согласно документам, ваш предполагаемый IndexedTraversal является незаконным, поскольку a индекс изменяется, если вы изменяете самый внутренний b.

Я не верю, что это правда: если я правильно понимаю selfIndex, a в индексе останется "оригинальным" a, а не станет тем, что модифицированный b внутри.

...