Aşağıdaki gibi tanımlanabileceği gibi sequenceA, anlamının en kolay yol olduğunu düşünüyorum traverse.
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
traverse f = sequenceA . fmap f
sequenceA bir yapının elemanlarını soldan sağa sıralar, sonuçları içeren aynı şekle sahip bir yapı döndürür.
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
sequenceA = traverse id
sequenceAİki işlevin sırasını tersine çevirmeyi de düşünebilirsiniz , örneğin bir eylemler listesinden bir sonuç listesi döndüren bir eyleme geçme.
Dolayısıyla traverse, bir yapı alır ve yapıdaki fher öğeyi bir uygulamaya dönüştürmek için uygulanır , ardından bu uygulamaların etkilerini soldan sağa sıralar ve sonuçları içeren aynı şekle sahip bir yapı döndürür.
Ayrıca Foldable, ilgili işlevi tanımlayan ile de karşılaştırabilirsiniz traverse_.
traverse_ :: (Foldable t, Applicative f) => (a -> f b) -> t a -> f ()
Eğer arasındaki temel fark, görebilirsiniz Foldableve Traversableönceki başka bir değer içine sonucu katlayın gerektirir, oysa ikinci, sen yapının şekli korumak için izin vermesidir.
Kullanımının basit bir örneği, geçilebilir yapı ve IOuygulama olarak bir liste kullanmaktır:
λ> import Data.Traversable
λ> let qs = ["name", "quest", "favorite color"]
λ> traverse (\thing -> putStrLn ("What is your " ++ thing ++ "?") *> getLine) qs
What is your name?
Sir Lancelot
What is your quest?
to seek the holy grail
What is your favorite color?
blue
["Sir Lancelot","to seek the holy grail","blue"]
Bu örnek oldukça heyecan verici olmasa da, traversebaşka tür kaplarda kullanıldığında veya başka uygulamalar kullanıldığında işler daha ilginç hale geliyor .