यह एक साक्षर हैकेल पोस्ट है। इसे चलाने के लिए बस इसे "ChurchList.lhs" के रूप में सहेजें।चर्च एन्कोडेड सूची की अधिक कुशल पूंछ
> {-# LANGUAGE Rank2Types #-}
एक चर्च एन्कोडेड सूची एक फ़ंक्शन के माध्यम से एक सूची का प्रतिनिधित्व करने का एक तरीका है। यह तह और निरंतर गुजरने वाली शैली दोनों जैसा दिखता है।
> newtype ChurchList a = CList {runCList :: forall r. (a -> r -> r) -> r -> r}
उदाहरण के लिए के रूप में यह कैसे एक सूची से मेल खाती है करने के लिए, यहाँ एक हे (एन) समाकृतिकता
> fromList :: [a] -> ChurchList a
> fromList xs = CList $ \cons empty -> foldr cons empty xs
> toList :: ChurchList a -> [a]
> toList cl = runCList cl (:) []
> instance Show a => Show (ChurchList a) where
> show cl = "fromList " ++ show (toList cl)
ये बातें अच्छे प्रदर्शन charecteristics है।
> singleton :: a -> ChurchList a -- O(1)
> singleton a = CList $ \cons empty -> a `cons` empty
> append :: ChurchList a -> ChurchList a -> ChurchList a -- O(1)!!! This also means cons and snoc are O(1)
> append cl1 cl2 = CList $ \cons empty -> runCList cl1 cons (runCList cl2 cons empty)
> concatCl :: ChurchList (ChurchList a) -> ChurchList a -- O(n)
> concatCl clcl = CList $ \cons empty -> runCList clcl (\cl r -> runCList cl cons r) empty
> headCl :: ChurchList a -> Maybe a -- O(1)
> headCl cl = runCList cl (\a _ -> Just a) Nothing
अब समस्या tail
के साथ आता है।
> tailClbad :: ChurchList a -> Maybe (ChurchList a) --O(n)?!!
> tailClbad cl = (fmap snd) $ runCList cl
>
> (\a r -> Just (a, case r of
> Nothing -> CList $ \cons empty -> empty
> Just (s,t) -> append (singleton s) t)) --Cons
>
> Nothing --Empty
अनिवार्य रूप से मेरा कार्यान्वयन क्या करता है सूची को सिर और पूंछ में विभाजित करता है। विपक्ष सिर की जगह लेता है, और पुराने सिर को पूंछ में जोड़ता है। यह बल्कि अक्षम है। ऐसा लगता है कि चर्च सूची सामान्य रूप से विभाजित होने में अक्षम हैं।
मुझे उम्मीद है कि मैं गलत हूं। क्या tailCl
का कार्यान्वयन है जो ओ (एन) से बेहतर है (अधिमानतः ओ (1))।
जैसा कि [इंगित किया गया] (https://mail.haskell.org/pipermail/haskell-cafe/2012- सितंबर/103493.html) ओलेग Kiselyov द्वारा, यह वास्तव में Boehm-Berarducci एन्कोडिंग है। मेल में जो लेख वह लिंक करता है वह काफी दिलचस्प है। –