2011-12-03 16 views
5

में दुभाषिया के साथ परिचालन मोनैड मैं हेनरिक अपफेलमस द्वारा operational monad का उपयोग कर रहा हूं। मैं परिणाम प्रकार के लिए मोनैड के साथ दुभाषिया को पैरामीटर बनाना चाहता हूं। मेरी कोड की निम्न संस्करण को संकलित करता है:मनमाना monad

{-# LANGUAGE GADTs #-} 

import Control.Monad.Operational 

data EloI a where 
    Display :: Int -> EloI() 

type Elo a = Program EloI a 

interpret :: Monad m => (Int -> m()) 
        -> Elo a 
        -> Int 
        -> m a 
interpret display = interp 
    where 
    interp :: Monad m => Elo a -> Int -> m a 
    interp = eval . view 
    eval :: Monad m => ProgramView EloI a -> Int -> m a 
    eval (Display i :>>= is) s = interp (is()) s 

अब मैं अब और

eval (Display i :>>= is) s = display i >> interp (is()) s 

और प्रकार निष्कर्ष करने के लिए अंतिम पंक्ति को बदलने सफल नहीं होता, मैं उत्पादन

नहीं किया जा सका मिल संदर्भ (मोनाड एम)
व्याख्या के लिए प्रकार हस्ताक्षर द्वारा बाध्य :: मोनाड एम => ।)

जब मैं इंटरप के लिए प्रकार हस्ताक्षर हटा देता हूं, तो मुझे एक अतिरिक्त त्रुटि मिलती है ((1 ~ ए) को कम नहीं कर सका)।
जब मैं सभी एम को आईओ में बदलता हूं (जैसे परिचालन मोनाड के लिए टिक टैक पैर उदाहरण में), तो यह फिर से संकलित होता है।
क्या मैं ऐसा कुछ करने की कोशिश कर रहा हूं जो समझ में नहीं आता है या क्या मैं जीएचसी को कुछ संकेत दे सकता हूं? मुझे यह मानना ​​है कि मुझे यकीन नहीं है कि मुझे इस लचीलापन की आवश्यकता है।

उत्तर

8

है ऐसा इसलिए है क्योंकि स्थानीय प्रकार हस्ताक्षर में m ताजा प्रकार चर हैं, इसलिए वे किसी भी इकाई के साथ काम करने वादा करता हूँ। यदि आप display का उपयोग करते हैं, eval केवल विशिष्ट मोनैड display उपयोगों के लिए काम कर सकता है। यदि आप एक) स्थानीय प्रकार हस्ताक्षर को दूर यह काम करना चाहिए, या ख) प्रकार चर m लाने गुंजाइश

{-# LANGUAGE ScopedTypeVariables #-} 
... 
interpret :: forall m. (Int -> m()) -> Elo a -> Int -> m a 
+0

में मैं भी एक कोशिश नहीं की) (althaugh मैं आमतौर पर स्थानीय प्रकार हस्ताक्षर का उपयोग नहीं करते हैं) क्योंकि उदाहरण कोड में निम्नलिखित कथन का "ध्यान दें कि चूंकि प्रोग्राम व्यू एक जीएडीटी है, इसलिए eval के लिए टाइप एनोटेशन अनिवार्य है।" – Duschvorhang

संबंधित मुद्दे