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 f
her öğ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 Foldable
ve 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 IO
uygulama 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, traverse
başka tür kaplarda kullanıldığında veya başka uygulamalar kullanıldığında işler daha ilginç hale geliyor .