मैं Cont
के साथ खेल रहा हूं here और this SO question में वर्णित मोनैड चालें। मैं Cont
के शीर्ष पर इकाई ट्रांसफार्मर के इन खिलौना उदाहरण हैपर स्टेट स्टेट। मेरा राज्य रीसेट क्यों नहीं किया जा रहा है?
import Control.Monad.Cont
import Control.Monad.State.Strict
import Control.Monad.Writer.Strict
getCC' :: MonadCont m => a -> m (a,a -> m b)
getCC' x0 = callCC (\c -> let f x = c (x, f) in return (x0, f))
:
इस समारोह आप गणना में पहले करने के लिए "वापस कूद", एक पैरामीटर लेने ताकि आप अलग तरह से काम कर सकते हैं की सुविधा देता है
foo :: WriterT String (Cont String)()
foo = do
(stop,loop) <- getCC' False
if stop
then do tell "bbb"
else do tell "aaa"
loop True
foo' :: StateT String (Cont String)()
foo' = do
(stop,loop) <- getCC' False
if stop
then do modify $ \s -> s ++ "bbb"
else do modify $ \s -> s ++ "aaa"
loop True
पहले उदाहरण में Cont
के प्रभाव WriterT
के प्रभाव पर "प्राथमिकता" है (अतः जुड़ा हुआ प्रश्न में explained के रूप में)। जब हम गणना रीसेट, लॉग खो दिया है:
*Main> print $ runCont (execWriterT foo) id
"bbb"
दूसरे उदाहरण बिल्कुल वही बात, केवल WriterT
के बजाय StateT
का उपयोग करता है। हालांकि, इस मामले में लॉग संरक्षित है!
*Main> print $ runCont (execStateT foo' "") id
"aaabbb"
इस विसंगति का स्पष्टीकरण क्या है?
मुझे लगता है राज्य भूल व्यवहार डिफ़ॉल्ट एक ही नहीं, 'WriterT' साथ एकरूपता के लिए होना चाहिए, लेकिन सहज नियम यह है कि आंतरिक monads के प्रभाव कुछ अर्थों में" प्राथमिकता दी जाती है "लागू करने के लिए। – danidiaz