का व्युत्पन्न चर रोकना मैं लाइब्रेरी के लिए एक प्रकार का वर्ग लिख रहा हूं ताकि एक अमूर्त इंटरफ़ेस को Proxy
-जैसी प्रकारों को परिभाषित किया जा सके। प्रकार वर्ग लग रहा है कि:किसी प्रकार की कक्षा या एक उदाहरण
class ProxyC p where
idT :: (Monad m) => b' -> p a' a b' b m r
(<-<) :: (Monad m)
=> (c' -> p b' b c' c m r)
-> (b' -> p a' a b' b m r)
-> (c' -> p a' a c' c m r)
... -- other methods
मैं भी Proxy
प्रकार है कि के रूप में हैं के लिए एक्सटेंशन लिख रहा हूँ:
instance (ProxyC p) => ProxyC (SomeExtension p) where ....
... और मुझे इन उदाहरणों चाहते हैं सक्षम होने के लिए एक अतिरिक्त बाधा लगाने के लिए कि m
Monad
है तो p a' a b' b m
a'
, a
, b'
, और b
के लिए Monad
है।
हालांकि, मुझे कोई संकेत नहीं है कि ProxyC
कक्षा या उदाहरणों के लिए या तो बाधा के रूप में इसे एन्कोड करना है। एकमात्र समाधान मैं वर्तमान में पता है के वर्ग के विधि हस्ताक्षर में यह एन्कोडिंग की तरह कुछ करने के लिए है:
(<-<) :: (Monad m, Monad (p b' b c' c m), Monad (p a' a b' b m))
=> (c' -> p b' b c' c m r)
-> (b' -> p a' a b' b m r)
-> (c' -> p a' a c' c m r)
... लेकिन मैं उम्मीद कर रही थी कि वहाँ एक सरल और अधिक सुरुचिपूर्ण समाधान होगा।
संपादित: और भी नहीं है कि पिछले समाधान, काम करता है के बाद से संकलक अनुमान नहीं है कि (Monad (SomeExtension p a' a b' b m))
चर का एक विशिष्ट विकल्प, तब भी जब निम्नलिखित उदाहरण दिए गए के लिए निकलता है (Monad (p a' a b' b m))
: #
instance (Monad (p a b m)) => Monad (SomeExtension p a b m) where ...
संपादित करें 2: अगले समाधान मैं विचार कर रहा हूँ बस ProxyC
वर्ग के भीतर Monad
वर्ग के लिए तरीकों डुप्लिकेट कर रही है:
class ProxyC p where
return' :: (Monad m) => r -> p a' a b' b m r
(!>=) :: (Monad m) => ...
... और फिर प्रत्येक ProxyC
उदाहरण के साथ उन्हें तुरंत चालू करना। यह मेरे उद्देश्यों के लिए ठीक लगता है क्योंकि Monad
विधियों को केवल विस्तार लेखन के लिए आंतरिक रूप से उपयोग करने की आवश्यकता है और मूल प्रकार के पास डाउनस्ट्रीम उपयोगकर्ता के लिए उचित Monad
उदाहरण है। यह सब सिर्फ उदाहरण लेखक को Monad
विधियों का खुलासा करता है।
AFAIK आप केवल बदसूरत हैक के साथ ऐसा कर सकते हैं, जैसे f.e. एडवर्ड Kmett http://hackage.haskell.org/packages/archive/constraints/0.3.2/doc/html/Data-Constraint-Forall.html –