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

  • Candyrat Records

    Candyrat Rec

    10 Mayıs 2006
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012