मैं के साथ मुक्त की तरह विचारों के आसपास खेल रहा था, और पाया इस:क्या इन नि: शुल्क निर्माणों का सामान्यीकरण है?
{-# LANGUAGE RankNTypes #-}
data Monoid m = Monoid { mempty :: m, mappend :: m -> m -> m }
data Generator a m = Generator { monoid :: Monoid m, singleton :: a -> m }
newtype Free f = Free { getFree :: forall s. f s -> s }
mkMonoid :: (forall s. f s -> Monoid s) -> Monoid (Free f)
mkMonoid f = Monoid {
mempty = Free (mempty . f),
mappend = \a b -> Free $ \s -> mappend (f s) (getFree a s) (getFree b s)
}
freeMonoid :: Monoid (Free Monoid)
freeMonoid = mkMonoid id
mkGenerator :: (forall s. f s -> Generator a s) -> Generator a (Free f)
mkGenerator f = Generator {
monoid = mkMonoid (monoid . f),
singleton = \x -> Free $ \s -> singleton (f s) x
}
freeGenerator :: Generator a (Free (Generator a))
freeGenerator = mkGenerator id
मैं जिसके तहत मैं एक funcion लिख सकता है खोजने के लिए करना चाहते हैं:
mkFree :: (??? f) => f (Free f)
लेकिन मैं असमर्थ रहे हैं f
के लिए एक सार्थक संरचना खोजने के लिए (छोटे से एक जिसमें mkFree
???
का एक तरीका है) जो इस फ़ंक्शन को लिखे जाने की अनुमति देगा। विशेष रूप से, मेरी सौंदर्य भावना पसंद करेगी यदि इस संरचना में Free
प्रकार का उल्लेख नहीं किया गया है।
क्या किसी ने इससे पहले ऐसा कुछ देखा है? क्या यह सामान्यीकरण संभव है? क्या एक दिशा में एक ज्ञात सामान्यीकरण है जिसे मैंने अभी तक नहीं सोचा है?
मैं Hackage पर इस राशि (church encoded version सटीक होना करने के लिए।): Http://hackage.haskell.org/ पैकेज/मुक्त functors-0.1।1, लेकिन मुझे नहीं लगता कि आप यही चाहते हैं? –
ठीक है, मेरे पैकेज में आपके पास जो मेल खाता है, मुझे लगता है कि मैं समझता हूं कि आप क्या चाहते हैं। अनुवादित यह होगा कि 'मॉनीओड (फ्री मोनॉयड ए)', या आम तौर पर एक उदाहरण 'सी (फ्री सी ए)' उदाहरण कैसे उत्पन्न किया जाए। उदा 'न्यू' उदाहरण यहां: https://github.com/sjoerdvisscher/free-functors/blob/master/examples/FreeNum.hs। यह मूल रूप से 'लिफ्टएएन' और साधारण मामलों के लिए कुछ शोर है, जो कुछ टेम्पलेट हैकेल के साथ हल करने योग्य होना चाहिए। लेकिन मुझे लगता है कि पूरी तरह से सामान्य मामला काफी जटिल है। –
@SjoerdVisscher, यह वह शोर है जिसमें मुझे रूचि है (यही कारण है कि मैं डेटा प्रकारों का उपयोग कर रहा हूं, यहां कक्षाएं नहीं)। यह 'ट्रैवर्सबल' जैसा लगता है, लेकिन यह पैरामीटर की नकारात्मक घटनाओं पर भी काम करता है। मैं सोच रहा था कि संरचनात्मक (आत्मनिरीक्षण प्रकार हस्ताक्षर) की बजाय बीजगणितीय संपत्ति (जैसे 'ट्रैवर्सबल') है, जिससे यह उदाहरण उत्पन्न किया जा सकता है। – luqui