मैं Hoopl लाइब्रेरी का उपयोग कर रहा हूं और फिर से लिखने के दौरान कुछ राज्य ले जाना चाहता हूं। पुनर्लेखन कार्य मोनैड के इस्तेमाल के बारे में पॉलिमॉर्फिक हैं, लेकिन मैं यह नहीं समझ सकता कि लाइब्रेरी के Fuel
मोनैड में से एक के साथ State
मोनैड को कैसे जोड़ा जाए।मैं होउप्ल में एक राज्य मोनड के साथ चेकिंगफ्यूलमोनाड को कैसे जोड़ सकता हूं?
नीचे एक न्यूनतम उदाहरण है। MyMonad
एक समानार्थी है जो होप्ल के CheckingFuelMonad
और State
मोनैड को ध्वज लेते हुए समानार्थी है। Stmt
मेरी मध्यवर्ती भाषा के लिए सिर्फ प्लेसहोल्डर है और वास्तव में महत्वपूर्ण नहीं है।
{-# LANGUAGE GADTs, RankNTypes #-}
import Compiler.Hoopl
import Control.Monad.State
type MyMonad = CheckingFuelMonad (State Bool)
data Stmt e x where
Bind ::() -> Stmt O O
rewriter :: forall e x. Stmt e x -> Fact x() -> MyMonad (Maybe (Graph Stmt e x))
rewriter (Bind())() = return $ do
f <- get
if f
then return $ Just emptyGraph
else return Nothing
लेकिन इस संकलन नहीं होगा - GHC शिकायत rewrite
गलत प्रकार है:
Couldn't match expected type `Graph' Block Stmt e x'
against inferred type `Maybe (g n O O)'
Expected type: CheckingFuelMonad
(State Bool) (Maybe (Graph Stmt e x))
Inferred type: CheckingFuelMonad
(State Bool) (Maybe (Maybe (g n O O)))
मैं क्या संभव करना चाहता हूँ है? मैं rewrite
फ़ंक्शन को सही तरीके से कैसे लिख सकता हूं?
मैं सुपर अविश्वसनीय हूं कि यह पुनर्लेख ध्वनि है। यह बहुत डोडी व्यवसाय है। –