objective पैकेज के आसपास खेलने के दौरान, मैंने देखा कि निम्नलिखित प्रकार की रोचक संपत्ति है।रैंकेंटिप्स का उपयोग करने वाले इस मज़ेदार का नाम क्या है?
> {-# LANGUAGE RankNTypes #-}
> data N f r = N { unN :: forall x. f x -> (x, r) }
यह एक फ़ैक्टर है।
> instance Functor (N f) where
> fmap f (N nat) = N $ fmap (fmap f) nat
> -- or, = N $ \fx -> let { (x,a) = nat fx } in (x, f a)
गूगल/hoogle के कुछ ही घंटों के बाद, मैं किसी भी मौजूदा मॉड्यूल है कि इस प्रकार के शामिल पाने के छोड़ दिया। इस प्रकार क्या है? यदि यह अच्छी तरह से जाना जाता है, तो नाम क्या है? क्या यह उपयोगी या अनदेखा है क्योंकि बेकार?
यह मेरी 100% मूल रचना नहीं है, क्योंकि एन उद्देश्य पैकेज में पाए गए ऑब्जेक्ट से लिया गया था।
> data Object f g = Object {
> runObject :: forall x. f x -> g (x, Object f g)
> }
N f
एक functor जो Object f Identity
पैदावार जब फिक्स करने के लिए लागू किया जाता है।
इस प्रकार के बारे में एक तथ्य है और मैंने क्यों सोचा कि यह दिलचस्प है।
एन रीडर को राइटर में परिवर्तित करता है, इसके विपरीत।
N ((->) e) r
= forall x. (e -> x) -> (x, r)
= (e, r)
N ((,) d) r
= forall x. (d, x) -> (x, r)
= d -> r
एन स्टोर राज्य इकाई को comonad बदलता है, लेकिन उलटा सच नहीं है (यहाँ मैं (=) प्रकार के बीच समाकृतिकता के लिए प्रतीक का इस्तेमाल किया)।
> data Store s a = Store s (s -> a)
> type State s a = s -> (s, a)
N (Store s) r
= forall x. (s, (s -> x)) -> (x, r)
= forall x. s -> (s -> x) -> (x, r)
= s -> (s, r)
= State s r
N (State s) r
= forall x. (s -> (s, x)) -> (x, r)
= forall x. (s -> s, s -> x) -> (x, r)
= forall x. (s -> s) -> (s -> x) -> (x, r)
= (s -> s) -> (s, r) -- ???
एन शायद नहीं ले सकता है।
N Maybe r
= forall x. Maybe x -> (x, r)
= forall x. (() -> (x, r), x -> (x, r))
= Void -- because (() -> (x, r)) can't be implemented
निम्नलिखित कार्य मजेदार हो सकता है। मैं इसे उलटा नहीं कर सका।
> data Cofree f a = Cofree a (f (Cofree f a))
> data Free f a = Pure a | Wrap (f (Free f a))
> unfree :: Free (N f) r -> N (Cofree f) r
> unfree (Pure r) = N $ \(Cofree a _) -> (a, r)
> unfree (Wrap n_f) = N $
> \(Cofree _ f) -> let (cofree', free') = unN n_f f
> in unN (unfree free') cofree'
संपूर्ण पोस्ट साक्षर हैस्केल (.lhs) है।
मुझे लगता है कि के लिए कोई नाम नहीं पता है, लेकिन के रूप में 'इसे लिखने (एक्स forall fx -।> ((,) आर) एक्स)' और यह कुछ 'Control.Comonad.Cofree को पारित किया जा सकता है कि हो जाता है। hoistFree'। – Gurkenglas
@chi 'एन' में कोई' g' नहीं है। यह 'ऑब्जेक्ट एफ जी' में 'जी ~ पहचान 'सेट कर रहा है। यदि आप 'एक्सल एक्स' से अनजान 'पहचान' को छोड़ देते हैं। एफ एक्स -> पहचान (एक्स, ऑब्जेक्ट एफ पहचान) 'आपको' एक्स 'मिल जाएगा। एफ एक्स -> (एक्स, ऑब्जेक्ट एफ) '। यदि आप 'ऑब्जेक्ट एफ' की रिकर्सिव घटना को नए पैरामीटर' आर 'के साथ प्रतिस्थापित करते हैं तो आपको' एक्सएल एक्स 'मिलता है। एफ एक्स -> (एक्स, आर) ', जो' एन एफ आर' है। 'फिक्स (एन एफ)' रिकर्सिव घटना को वापस रखता है जहां 'आर' था। – Cirdec
ऐसा लगता है कि ['Ran'] (https://hackage.haskell.org/package/profunctors/docs/Data-Profunctor-Ran.html#t:Ran), लेकिन मिश्रण और profunctors और bifunctors मिलान। 'फॉरल एक्स। एफ एक्स -> एक्स' 'एफ' में एक सूचकांक है। दूसरा भाग 'फॉरल एक्स' के पर्यावरण से एक पाठक है। एफ एक्स', 'एफ' की संरचना को पढ़ना, लेकिन इसके मूल्य नहीं। – Cirdec