में दुभाषिया के साथ परिचालन मोनैड मैं हेनरिक अपफेलमस द्वारा 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 ~ ए) को कम नहीं कर सका)।
जब मैं सभी एम को आईओ में बदलता हूं (जैसे परिचालन मोनाड के लिए टिक टैक पैर उदाहरण में), तो यह फिर से संकलित होता है।
क्या मैं ऐसा कुछ करने की कोशिश कर रहा हूं जो समझ में नहीं आता है या क्या मैं जीएचसी को कुछ संकेत दे सकता हूं? मुझे यह मानना है कि मुझे यकीन नहीं है कि मुझे इस लचीलापन की आवश्यकता है।
में मैं भी एक कोशिश नहीं की) (althaugh मैं आमतौर पर स्थानीय प्रकार हस्ताक्षर का उपयोग नहीं करते हैं) क्योंकि उदाहरण कोड में निम्नलिखित कथन का "ध्यान दें कि चूंकि प्रोग्राम व्यू एक जीएडीटी है, इसलिए eval के लिए टाइप एनोटेशन अनिवार्य है।" – Duschvorhang