{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
import Control.Comonad
import Data.Functor.Reverse
import Data.List (unfoldr)
पहले कुछ संदर्भ (हा हा) पर ध्यान केंद्रित करने के सभी तरीकों को खोजना। मेरे पास zipper गैर-खाली सूचियों पर है।एक ग्रिड
data LZipper a = LZipper (Reverse [] a) a [a]
deriving (Eq, Ord, Show, Read, Functor, Foldable, Traversable)
mkZipper :: a -> [a] -> LZipper a
mkZipper = LZipper (Reverse [])
आप जिपर के साथ किसी भी दिशा में कदम उठा सकते हैं, लेकिन आप अंत से गिर सकते हैं।
fwd, bwd :: LZipper a -> Maybe (LZipper a)
fwd (LZipper _ _ []) = Nothing
fwd (LZipper (Reverse xs) e (y:ys)) = Just $ LZipper (Reverse (e:xs)) y ys
bwd (LZipper (Reverse []) _ _) = Nothing
bwd (LZipper (Reverse (x:xs)) e ys) = Just $ LZipper (Reverse xs) x (e:ys)
एक ज़िपर नकल आप सभी तरीकों से आप इसे देख सकते हैं, जिस तरह से आप इसे वर्तमान में देख रहे हैं पर ध्यान देने के साथ दिखाता है।
instance Comonad LZipper where
extract (LZipper _ x _) = x
duplicate z = LZipper (Reverse $ unfoldr (step bwd) z) z (unfoldr (step fwd) z)
where step move = fmap (\y -> (y, y)) . move
उदाहरण के लिए:
ghci> duplicate (mkZipper 'a' "bc")
LZipper (Reverse [])
(LZipper (Reverse "") 'a' "bc")
[LZipper (Reverse "a") 'b' "c",LZipper (Reverse "ba") 'c' ""]
-- Abc -> *Abc* aBc abC
ghci> fmap duplicate (fwd $ mkZipper 'a' "bc")
Just (LZipper (Reverse [LZipper (Reverse "") 'a' "bc"])
(LZipper (Reverse "a") 'b' "c")
[LZipper (Reverse "ba") 'c' ""])
-- aBc -> Abc *aBc* abC
(मैं ज़िपर का केन्द्र बिन्दु इंगित करने के लिए की राजधानियों और तारक उपयोग कर रहा हूँ।)
मैं दो के साथ काम करने की कोशिश कर रहा हूँ
फोकस के साथ आयामी ग्रिड, ज़िप्पर के एक जिपर के रूप में प्रतिनिधित्व किया। प्रत्येक आंतरिक जिपर ग्रिड की एक पंक्ति है। मेरा अंतिम लक्ष्य पड़ोसी से पड़ोसी से छिपकर ग्रिड के माध्यम से पथ ढूंढना है।
ग्रिड के माध्यम से चलना इनवेरिएंट को बनाए रखता है कि सभी पंक्तियों को एक ही इंडेक्स पर केंद्रित किया जाता है। यह आपके पड़ोसियों पर ध्यान केंद्रित करना आसान बनाता है।
type Grid a = LZipper (LZipper a)
up, down, left, right :: Grid a -> Maybe (Grid a)
up = bwd
down = fwd
left = traverse bwd
right = traverse fwd
extractGrid :: Grid a -> a
extractGrid = extract . extract
mkGrid :: (a, [a]) -> [(a, [a])] -> Grid a
mkGrid (x, xs) xss = mkZipper (mkZipper x xs) $ map (uncurry mkZipper) xss
उदाहरण: एक समारोह है कि एक ग्रिड लेता है और सभी तरह से आप ग्रिड पर दिखाई दे सकता है की एक ग्रिड का उत्पादन:
ghci> let myGrid = mkGrid ('a', "bc") [('d', "ef"), ('g', "hi")]
ghci> myGrid
LZipper (Reverse [])
(LZipper (Reverse "") 'a' "bc")
[LZipper (Reverse "") 'd' "ef",LZipper (Reverse "") 'g' "hi"]
-- +-------+
-- | A b c |
-- | d e f |
-- | g h i |
-- +-------+
ghci> return myGrid >>= right >>= down
Just (LZipper (Reverse [LZipper (Reverse "a") 'b' "c"])
(LZipper (Reverse "d") 'e' "f")
[LZipper (Reverse "g") 'h' "i"])
-- +-------+
-- | a b c |
-- | d E f |
-- | g h i |
-- +-------+
क्या मैं चाहता हूँ ग्रिड के लिए LZipper
के duplicate
के बराबर है , वर्तमान पर ध्यान केंद्रित करने के साथ आप इसे देख रहे हैं।
duplicateGrid :: Grid a -> Grid (Grid a)
मैं क्या उम्मीद कर रहा हूँ:
duplicateGrid myGrid
+-------------------------------+
| ********* +-------+ +-------+ |
| * A b c * | a B c | | a b C | |
| * d e f * | d e f | | d e f | |
| * g h i * | g h i | | g h i | |
| ********* +-------+ +-------+ |
| +-------+ +-------+ +-------+ |
| | a b c | | a b c | | a b c | |
| | D e f | | d E f | | d e F | |
| | g h i | | g h i | | g h i | |
| +-------+ +-------+ +-------+ |
| +-------+ +-------+ +-------+ |
| | a b c | | a b c | | a b c | |
| | d e f | | d e f | | d e f | |
| | G h i | | g H i | | g h I | |
| +-------+ +-------+ +-------+ |
+-------------------------------+
मैं duplicateGrid = duplicate . duplicate
की कोशिश की। यह सही प्रकार है, लेकिन (यह मानते हुए कि मैं show
उत्पादन सही ढंग से व्याख्या की है, जो मैं शायद नहीं था) यह केवल देता है मुझे कहीं प्रथम स्तंभ पर ध्यान केंद्रित ग्रिड:
(duplicate . duplicate) myGrid
+-------------------------------+
| ********* +-------+ +-------+ |
| * A b c * | a b c | | a b c | |
| * d e f * | D e f | | d e f | |
| * g h i * | g h i | | G h i | |
| ********* +-------+ +-------+ |
| +-------+ +-------+ +-------+ |
| | A b c | | a b c | | a b c | |
| | d e f | | D e f | | d e f | |
| | g h i | | g h i | | G h i | |
| +-------+ +-------+ +-------+ |
| +-------+ +-------+ +-------+ |
| | A b c | | a b c | | a b c | |
| | d e f | | D e f | | d e f | |
| | g h i | | g h i | | G h i | |
| +-------+ +-------+ +-------+ |
+-------------------------------+
मैं भी duplicateGrid = duplicate . fmap duplicate
की कोशिश की। एक बार फिर से यह मानते हुए कि मैं show
उत्पादन व्याख्या करने में सक्षम हूँ, यह मुझे कुछ है कि दोनों गलत ग्रिड निहित दिया और गलत संरेखित पंक्तियों की केंद्रित, ऐसी है कि नीचे जा भी साथ आप ले होता था:
(duplicate . fmap duplicate) myGrid
+-------------------------------+
| ********* +-------+ +-------+ |
| * A b c * | D e f | | G h i | |
| * a B c * | d E f | | g H i | |
| * a b C * | d e F | | g h I | |
| ********* +-------+ +-------+ |
| +-------+ ********* +-------+ |
| | A b c | * D e f * | G h i | |
| | a B c | * d E f * | g H i | |
| | a b C | * d e F * | g h I | |
| +-------+ ********* +-------+ |
| +-------+ +-------+ ********* |
| | A b c | | D e f | * G h i * |
| | a B c | | d E f | * g H i * |
| | a b C | | d e F | * g h I * |
| +-------+ +-------+ ********* |
+-------------------------------+
ऐसा लगता है कि यह जानने वालों के लिए एक आसान सवाल होगा, लेकिन यह मेरा सिर स्पिन कर रहा है। मुझे लगता है कि मैं एक समारोह को हाथ-क्रैंक कर सकता हूं जो up
, down
, left
और right
पर कॉल करता है, लेकिन मुझे लगता है कि कॉमोनैडिक मशीनरी को मेरे लिए ऐसा करने में सक्षम होना चाहिए। duplicateGrid
का सही कार्यान्वयन क्या है?
एफवाईआई, आपको अन्य बिट्स में रुचि हो सकती है। Http: // stackoverflow देखें।कॉम/ए/25572148/1477667 – dfeuer
और [यह एक] (http://stackoverflow.com/questions/12963733/writing-cojoin-or-cobind-for-n-dimensional-grid-type/13100857#13100857) कौन से पते आपका प्रश्न विशेष रूप से। मैंने किसी भी तरह इसे याद किया, और मेरा जवाब इसकी रोशनी में अनावश्यक है, लेकिन कम से कम मुझे अपने लिए इसका हिस्सा समझने का अवसर मिला। –
@ AndrásKovács डी ओह, मेरा सवाल उस का सटीक डुप्लिकेट प्रतीत होता है। पता नहीं जब मैं खोज रहा था मुझे यह क्यों नहीं मिला। मैं सही काम करूंगा और इसे बंद कर दूंगा। –