SORU
18 EYLÜL 2011, Pazar


Birisi Haskell geçiş işlevini açıklayabilir.

Haskell için acemiyim. Çalışıyorum ve Data.Traversable modülü traverse işlevi grok için başarısızım. Onun nokta göremiyorum. Zorunlu bir arka plan geldiğim günden beri, biri zorunlu bir döngü açısından bana bunu açıklayabilecek olan var mı? Pseudo-code bir çok mutluluk duyacağız. Teşekkürler.

CEVAP
18 EYLÜL 2011, Pazar


traverse ayrıca veri yapısını yeniden inşa ederken etkileri çalıştırmak için izin dışında fmap, aynıdır.

Data.Traversable belgelerden örnek bir göz atın.

 data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)

Tree Functor örnek olabilir:

instance Functor Tree where
  fmap f Empty        = Empty
  fmap f (Leaf x)     = Leaf (f x)
  fmap f (Node l k r) = Node (fmap f l) (f k) (fmap f r)

Tüm ağaç, her değer için f uygulama oluşturur.

instance Traversable Tree where
    traverse f Empty        = pure Empty
    traverse f (Leaf x)     = Leaf <$> f x
    traverse f (Node l k r) = Node <$> traverse f l <*> f k <*> traverse f r

Traversable örnek kurucular uygulamalı tarzı denir hariç hemen hemen aynı. Bu ağacı yeniden inşa ederken (yan)etkileri sahip olduğumuzu gösteriyor. Uygulamalı neredeyse monadlar aynı etkileri önceki sonuçlarına bağlı olamaz. Bu örnekte bir düğüm örneğin sol dal yeniden inşa sonuçlarına bağlı olarak sağ dal farklı bir şeyler yapabilirsin değil demektir.

Traversable sınıfı da etkileri önceki sonuçlarına bağlı olabilecek monadic bir sürümü mapM içerir. (Bunu yapmak zorunda değilsin eminim, ama Traversable sınıfı biraz kanunları ışık.) Örneğin, eğer sol şube Empty iki kez f etkisi:

mapM f (Node l k r) = do
  l' <- mapM f l
  k' <- case l' of
    Empty -> do _ <- f k; f k
    _     -> f k
  r' <- mapM f r
  return $ Node l' k' r'

Eğer saf olmayan bir dilde bunu uygulamak istiyorsanız, fmap traverse yan etkileri önlemek için bir yolu yok gibi mapM ile aynı olacaktır. Geçiş için veri yapısı yinelemeli olarak bir döngü olarak uygulayabilirsiniz. Burada Javascript bunu yapmak istiyorum nasıl küçük bir örnek:

Node.prototype.traverse = function (f) {
  return new Node(this.l.traverse(f), f(this.k), this.r.traverse(f));
}

Bu gibi uygulama dili olsa da sağlayan etkileri sınırlar. Sen f.e. olmayan determinizm liste örneği Uygulamalı model) ve dil-yerleşik yok, şansına küs.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Distractify

    Distractify

    1 Aralık 2011
  • Flash CS6 Video Tutorials for Beginners (Actionscript 3 Gaming)

    Flash CS6 Vi

    14 EYLÜL 2012
  • Mindy

    Mindy

    20 NİSAN 2006