2011-08-30 22 views
6

शायद मैं इस बारे में गलत तरीके से जा रहा हूँ के अंदर एक आईओ इकाई कॉलिंग, लेकिन मैं कुछ शीर्ष डेटा है कि मैं HOpenGL में एक सरणी में उपयोग करना चाहते हैं में पढ़ने के लिए HXT उपयोग कर रहा हूँ। वेरटेक्स सरणी को एक पीआरआर होना चाहिए जो न्यूएरे को कॉल करके बनाया गया हो। दुर्भाग्यवश न्यूएरे एक आईओ पीआरआर लौटाता है, इसलिए मुझे यकीन नहीं है कि तीर के अंदर इसका उपयोग कैसे किया जाए। मुझे लगता है कि मुझे आईओ के समान एक प्रकार की घोषणा के साथ कुछ चाहिए -> तीर ए?एक तीर

उत्तर

5

प्रकार IO a -> Arrow a मतलब नहीं है; Arrow एक प्रकार वर्ग, नहीं एक विशेष प्रकार, Monad या Num की तरह ज्यादा है। विशेष रूप से, Arrow का एक उदाहरण एक प्रकार का कन्स्ट्रक्टर है जो दो पैरामीटर लेता है जो उन चीजों का वर्णन करता है जो कार्यों की तरह बनाये जा सकते हैं, मिलान प्रकारों को अंत तक अंत तक। तो, IO a को एक तीर में परिवर्तित करने के लिए शायद एक वैचारिक प्रकार त्रुटि कहा जा सकता है।

मुझे यकीन है कि आप क्या करने की कोशिश कर रहे हैं कि वास्तव में क्या नहीं कर रहा हूँ, लेकिन अगर आप वास्तव में एक Arrow के हिस्से के रूप IO संचालन का उपयोग किया जा करना चाहते हैं, तो आप अपने Arrow उदाहरण की जरूरत है कि शामिल करने के लिए। इसका सबसे सरल रूप यह है कि किसी भी Monad उदाहरण के लिए a -> m b जैसे प्रकारों के साथ कार्यों को स्पष्ट तरीके से बनाया जा सकता है।

newtype IOSLA s a b = IOSLA { runIOSLA :: s -> a -> IO (s, [b]) } 

यह IO, State, और [] monads के कुछ मिश्रण है, एक समारोह से जुड़ी इस तरह के ऊपर है कि आप रचना कर सकते हैं के रूप में उन्हें तीनों Monad रों माध्यम से जा रहा: hxt पैकेज एक और अधिक जटिल प्रकार प्रदान करने के लिए लगता है प्रत्येक चरण में। मैं वास्तव में hxt ज्यादा इस्तेमाल नहीं किया है, लेकिन अगर ये हैं Arrow रों आप के साथ काम कर रहे हैं, यह बहुत एक मनमाना IO एक के रूप में सेवा करने के लिए समारोह लिफ्ट करने के लिए आसान है - बस अपरिवर्तित के माध्यम से राज्य मूल्य s गुजरती हैं, और उत्पादन की बारी एक सिंगलटन सूची में समारोह का। आपके लिए यह करने के लिए पहले से ही एक समारोह हो सकता है, लेकिन मैंने एक संक्षिप्त नज़र में एक नहीं देखा।

liftArrIO :: (a -> IO b) -> IOSLA s a b 
liftArrIO f = IOSLA $ \s x -> fmap (\y -> (s, [y])) (f x) 
+1

[ 'arrIO'] (http://hackage.haskell.org/packages/archive/hxt/9.1.4/doc/html/:

मूल रूप से, आप कुछ इस तरह चाहते हैं नियंत्रण-तीर-तीरियो.html # वी: एआरआईओ) वह दिखता है जिसे वह ढूंढ रहा है। इसका कार्यान्वयन मूल रूप से आपके समान है। – hammar

+0

@hammar: * आह! * धन्यवाद, किसी कारण से मुझे लगता है कि यह नाम में "लिफ्ट" होगा। –

+0

अहह हाँ, यह ठीक है! हर बार जब मुझे लगता है कि मुझे तीरों और मोनैड मिल गए हैं तो मैं उन्हें फिर से बाहर निकालने के लिए हवादार हूं ... – John

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