traverse
mengubah hal-hal di dalam a Traversable
menjadi Traversable
sesuatu "di dalam" an Applicative
, diberi fungsi yang membuat Applicative
s dari benda-benda.
Mari gunakan Maybe
sebagai Applicative
dan daftar sebagai Traversable
. Pertama kita membutuhkan fungsi transformasi:
half x = if even x then Just (x `div` 2) else Nothing
Jadi jika angkanya genap, kita mendapatkan setengahnya (di dalam a Just
), kalau tidak kita dapatkan Nothing
. Jika semuanya berjalan "baik", akan terlihat seperti ini:
traverse half [2,4..10]
--Just [1,2,3,4,5]
Tapi...
traverse half [1..10]
-- Nothing
Alasannya adalah bahwa <*>
fungsi tersebut digunakan untuk membangun hasil, dan jika salah satu argumennya adalah Nothing
, kami Nothing
kembali.
Contoh lain:
rep x = replicate x x
Fungsi ini menghasilkan daftar panjang x
dengan konten x
, misalnya rep 3
= [3,3,3]
. Apa hasil dari traverse rep [1..3]
?
Kami mendapatkan hasil parsial [1]
, [2,2]
dan [3,3,3]
menggunakan rep
. Sekarang semantik daftar sebagai Applicatives
yang "mengambil semua kombinasi", misalnya (+) <$> [10,20] <*> [3,4]
adalah [13,14,23,24]
.
"Semua kombinasi" [1]
dan [2,2]
dua kali [1,2]
. Semua kombinasi dua kali [1,2]
dan [3,3,3]
enam kali [1,2,3]
. Jadi kita punya:
traverse rep [1..3]
--[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]