2016-04-01 19 views
2
traverse :: Applicative f => (a -> f b) -> t a -> f (t b) 

Merhaba, imza anlayamıyorum bir çok fonksiyonu vardır
. Tabii ki, bu traversin önce iki argüman olduğunu anladım, ilk önce fonksiyon. Ancak,
ne anlama geliyor (a -> f b)? (a -> b)'u anlayabilirim.
Benzer şekilde, t a, f (t b)anlama imza

Açıklayabilir misiniz?

+1

'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

+1

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

+0

Teşekkürler. Lütfen söyle bana: Her zaman [a]? –

cevap

3

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!

İlgili konular