traverse
, bu tür davranışların davranışının ne yazık ki, tam olarak t
olmasını istediğimiz şeye bağlı olduğu bir sınıf sınıfı işlevidir. Bu >>=
veya fmap
'a benzer değildir. Ancak, bu gibi davranışlar için de kurallar vardır. Kurallar, traverse
'un a
'dan b
'a kadar etkili bir dönüşüm olan a -> f b
işlevini alması ve yerel dönüşümlerin her birinin etkilerini toplayarak a
s boyutunda bir "kapsayıcı" üzerinde çalışması için kaldırması gerektiğine inanmaktadır. Biz Maybe a
varsa
Örneğin, traverse
uygulanması listeleri
için
traverse f (Just a) = Just <$> f a
traverse f Nothing = pure Nothing
olacağını biz "etkisi" f
olmasından yararlanarak nasıl olduğunu
traverse f [a1, a2, ...] = (:) <$> f a1 <*> ((:) <$> f a2 <*> ...))
Bildirimi sadece bir functor değil, aynı zamanda iki f-ful hesaplamaları, f a
ve f b
'u alabilir ve f (a, b)
almak için bunları birlikte parçalayabiliriz. Şimdi, tüm travers'in yapabileceklerini belirten birkaç yasa ile, elemanlara f
uygulayın ve dışarıdaki etkileri toplarken orijinal t a
yedekini oluşturun. Biz
traverse Identity = Identity -- We don't lose elements
t . traverse f = traverse (t . f) -- For nicely composing t
traverse (Compose . fmap g . f) = Compose . fmap (traverse g) . traverse f
Şimdi bu oldukça karmaşık görünüyor ama yapıyor bütün anlamını açıklayan bir "Temelde etrafında yürür ve yerel dönüşümü uygular" derler. Bütün bunlar sadece traverse
ne yaptığını anlamak için imza okuyamaz ise, imza için bir ok sezgi
- Biz
a
s f :: a -> f b
- bir funktor tam bir yerel, effectful fonksiyonunu olsun olmasıdır aşağı kaynar
- Biz
f
tüm etkileri sadece, f (t b)
değil almak yüzden toplanır fmap
- ala, art arda
f
uygulayarak kazanılmış b
dolu bir functor geri almak 10
Bununla birlikte, traverse
bazı tuhaf yollarla kullanılabilir. Örneğin, objektif paketi traverse
kullanarak harika bir etki yaratan çok garip funktörlerle doludur.
Hızlı bir test olarak, numaralı telefonu yasal olarak fmap
'u t
için uygulamak için nasıl kullanabileceğinizi öğrenebilir misiniz? Yani bu çaprazlanabiliyorsa örneklerini de Functor
ve Foldable
tatmin gerçeğinin sonuçlarıdır ait
fmapOverkill :: Traversable f => (a -> b) -> (f a -> f b)
Ya headMay
headMay :: Traversable t => t a -> Maybe a
Hem olduğunu!
'f' bir tür kurucuyu (düşün' f = Belki ') ifade eder, bu yüzden' t' ('t = []' dır) - anlayabilir misiniz (a -> Belki b) -> [a] -> Belki de [b] '? – Carsten
Eğer bu durum için bir duygu almak istiyorsanız, '' traverse (\ a-> bile olsa bir Just bile (bir 'div' 2) başka hiçbir şey) ile biraz oynayabilirsiniz [2,4,6]' '(giriş listesini değiştirmeyi deneyin);) – Carsten
Teşekkürler. Lütfen söyle bana: Her zaman [a]? –