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