खोज…


टिप्पणियों

उदाहरणों में यहां बताए गए कार्यों को कई पैकेजों में अमूर्तता की अलग-अलग डिग्री के साथ परिभाषित किया गया है, उदाहरण के लिए, data-fix और recursion-schemes (यहां अधिक कार्य)। आप Hayoo पर खोज कर एक और पूरी सूची देख सकते हैं।

निश्चित अंक

Fix एक "टेम्पलेट" प्रकार लेता है और पुनरावर्ती गाँठ को बांधता है, टेम्पलेट को लेसेगैन की तरह लेटाता है।

newtype Fix f = Fix { unFix :: f (Fix f) }

एक Fix f अंदर हम टेम्पलेट f की एक परत पाते हैं। f के पैरामीटर को भरने के लिए, अपने आप में Fix f प्लग को Fix f । इसलिए जब आप टेम्पलेट f अंदर देखते हैं तो आपको Fix f की पुनरावर्ती घटना का पता चलता है।

यहाँ बताया गया है कि कैसे एक विशिष्ट पुनरावर्ती डेटाटाइप को टेम्प्लेट और निश्चित बिंदुओं के हमारे ढांचे में अनुवाद किया जा सकता है। हम प्रकार के पुनरावर्ती घटनाओं को हटाते हैं और r पैरामीटर का उपयोग करके उनकी स्थिति को चिह्नित करते हैं।

{-# LANGUAGE DeriveFunctor #-}

-- natural numbers
-- data Nat = Zero | Suc Nat
data NatF r = Zero_ | Suc_ r deriving Functor
type Nat = Fix NatF

zero :: Nat
zero = Fix Zero_
suc :: Nat -> Nat
suc n = Fix (Suc_ n)


-- lists: note the additional type parameter a
-- data List a = Nil | Cons a (List a)
data ListF a r = Nil_ | Cons_ a r deriving Functor
type List a = Fix (ListF a)

nil :: List a
nil = Fix Nil_
cons :: a -> List a -> List a
cons x xs = Fix (Cons_ x xs)


-- binary trees: note two recursive occurrences
-- data Tree a = Leaf | Node (Tree a) a (Tree a)
data TreeF a r = Leaf_ | Node_ r a r deriving Functor
type Tree a = Fix (TreeF a)

leaf :: Tree a
leaf = Fix Leaf_
node :: Tree a -> a -> Tree a -> Tree a
node l x r = Fix (Node_ l x r)

एक समय में एक परत एक संरचना को मोड़ना

कायापलट , या सिलवटों , मॉडल आदिम पुनरावृत्ति। cata परत से एक fixpoint परत नीचे आँसू, एक बीजगणित समारोह (समारोह या तह) का उपयोग कर प्रत्येक परत पर कार्रवाई करने के। cata को टेम्प्लेट टाइप f लिए Functor इंस्टेंस की आवश्यकता होती है।

cata :: Functor f => (f a -> a) -> Fix f -> a
cata f = f . fmap (cata f) . unFix

-- list example
foldr :: (a -> b -> b) -> b -> List a -> b
foldr f z = cata alg
    where alg Nil_ = z
          alg (Cons_ x acc) = f x acc

एक समय में एक परत एक संरचना को खोलना

Anamorphisms, या करेंगी, मॉडल आदिम corecursion। ana प्रत्येक नई परत का उत्पादन करने के लिए एक कोलजब्रा फ़ंक्शन (या अनफॉलोिंग फ़ंक्शन ) का उपयोग करके परत द्वारा एक फिक्स पॉइंट परत बनाता है। ana को टेम्पलेट प्रकार f लिए एक Functor इंस्टेंस की आवश्यकता होती है।

ana :: Functor f => (a -> f a) -> a -> Fix f
ana f = Fix . fmap (ana f) . f

-- list example
unfoldr :: (b -> Maybe (a, b)) -> b -> List a
unfoldr f = ana coalg
    where coalg x = case f x of
                         Nothing -> Nil_
                         Just (x, y) -> Cons_ x y

ध्यान दें कि ana और cata दोहरे हैं । प्रकार और कार्यान्वयन एक दूसरे के दर्पण चित्र हैं।

अनफॉलो करना और फिर फोल्ड करना, फ्यूज्ड

किसी प्रोग्राम को डेटा संरचना के रूप में बनाना और फिर उसे एक ही मूल्य पर ढहना आम है। इसे हिल्मोर्फिफ़ या रिफॉल्ड कहा जाता है। बेहतर दक्षता के लिए मध्यवर्ती संरचना को पूरी तरह से समाप्त करना संभव है।

hylo :: Functor f => (a -> f a) -> (f b -> b) -> a -> b
hylo f g = g . fmap (hylo f g) . f  -- no mention of Fix!

व्युत्पत्ति:

hylo f g = cata g . ana f
         = g . fmap (cata g) . unFix . Fix . fmap (ana f) . f  -- definition of cata and ana
         = g . fmap (cata g) . fmap (ana f) . f  -- unfix . Fix = id
         = g . fmap (cata g . ana f) . f  -- Functor law
         = g . fmap (hylo f g) . f  -- definition of hylo

आदिम पुनरावृत्ति

पैराओमफ़िज़म आदिम पुनरावर्तन मॉडल। तह के प्रत्येक पुनरावृत्ति पर, तह फ़ंक्शन आगे की प्रक्रिया के लिए सबट्री प्राप्त करता है।

para :: Functor f => (f (Fix f, a) -> a) -> Fix f -> a
para f = f . fmap (\x -> (x, para f x)) . unFix

प्रेल्यूड्स की tails को एक प्रतिमान के रूप में चित्रित किया जा सकता है।

tails :: List a -> List (List a)
tails = para alg
    where alg Nil_ = cons nil nil  -- [[]]
          alg (Cons_ x (xs, xss)) = cons (cons x xs) xss  -- (x:xs):xss

आदिम शव

एपोमोर्फ़िज्म आदिम corecursion मॉडल। अनफॉल्ड के प्रत्येक पुनरावृत्ति पर, एक्सफोल्डिंग फ़ंक्शन या तो एक नया बीज या पूरे उपट्री वापस कर सकता है।

apo :: Functor f => (a -> f (Either (Fix f) a)) -> a -> Fix f
apo f = Fix . fmap (either id (apo f)) . f

ध्यान दें कि apo और para दोहरे हैं । प्रकार में तीर फ़्लिप हैं; para में ट्यूपल apo में apo Either दोहरी है, और कार्यान्वयन एक दूसरे के दर्पण चित्र हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow