ho appena written a function (per Data.Sequence
)Come posso testare le funzioni polimorfiche su Applicativi?
traverseWithIndex :: Applicative f => (Int -> a -> f b) -> Seq a -> f (Seq b)
che dovrebbe obbedire
traverseWithIndex f = sequenceA . mapWithIndex f
Per fortuna, questo è una modifica meccanica semplice della fonte di mapWithIndex
, quindi sono abbastanza sicuro che sia corretta . Tuttavia, in casi più complessi sarebbero necessari test approfonditi. Sto cercando di scrivere una proprietà QuickCheck per testare questo semplice. Ovviamente, non posso provarlo con ogni funcion Applicative
! Quando si testano i monoidi, ha senso testare con il monoide libero su (cioè gli elenchi finiti di) un certo tipo. Quindi sembra ragionevole testare con lo free applicative functor su qualche functor. Esistono due difficoltà:
Come scegliere un funtore di base appropriato? Presumibilmente voglio uno cattivo che non sia applicativo o attraversabile o altro, ma una cosa del genere sembra difficile da lavorare.
Come si confrontano i risultati? Avranno funzioni in loro, quindi non hanno l'istanza
Eq
.
Ooh, cose da leggere. Dovrò provare domani! Questo approccio algebrico sembra promettente. – dfeuer