Я просто написал функцию (для Data.Sequence
)
traverseWithIndex :: Applicative f => (Int -> a -> f b) -> Seq a -> f (Seq b)
который должен подчиняться
traverseWithIndex f = sequenceA . mapWithIndex f
К счастью, это простая механическая модификация источника mapWithIndex
, поэтому я вполне уверен, что это правильно. Однако в более сложных случаях потребуется тщательное тестирование. Я пытаюсь написать свойство QuickCheck, чтобы проверить этот простой. Очевидно, я не могу попробовать это с каждым функтором Applicative
! При тестировании моноидов имеет смысл протестировать со свободным моноидом (например, с конечными списками) какого-либо типа. Поэтому здесь кажется разумным протестировать с помощью свободный прикладной функтор над некоторым функтором. Есть две трудности:
-
Как выбрать подходящий базовый функтор? Я, по-видимому, хочу отвратительного, который не является аппликативным или доступным, или что-то еще, но с такой работой, похоже, трудно работать.
-
Как сравнить результаты? Они будут иметь в них функции, поэтому они не имеют экземпляра
Eq
.