मैं इस tutorial के बाद सामान्य रूप से निरंतरता को समझने की कोशिश कर रहा हूं।राज्य मोनड के सीपीएस संस्करण में 'कैसे' काम करता है?
हालांकि, मैं अनुभाग 2.10 में निम्न उदाहरण समझने के लिए कठिनाइयों का हो रहा है:
# let get() =
shift (fun k -> fun state -> k state state) ;;
get : unit => ’a = <fun>
state
प्रकार int
मुझे लगता है की है। मुझे जो मिला वह k
का प्रकार नहीं है। मेरी समझ के अनुसार, k
कब्जा सभी गणना get()
के बाद बाद में आता है, और के बाद से हम एक राज्य इकाई के बारे में बात कर रहे हैं, k
एक गणना है कि एक int
लेने के द्वारा जारी रखा जाएगा प्रतिनिधित्व करने के लिए उचित है, इसलिए
k : int => 'a
लेकिन से कोड है, यह है कि ऐसा प्रतीत नहीं होता है और यह दूसरी बार है, जो वास्तव तात्पर्य के लिए state
लेता है:
k : int => int => 'a
लेकिन मैं नहीं मिलता है जहां दूसरी से आ रही है, और जिसमें भावना get
उसका है unit => int => 'a
के बजाय unit => 'a
टाइप करें?
वास्तविक राज्य इकाई कार्यान्वयन की तुलना में, भ्रम की स्थिति अधिक जोड़ता है:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
यानी राज्य संक्रमण परिणाम और राज्य के एक टपल, जो मेरी पहली समझ से मेल खाता है करने के लिए राज्य से एक समारोह के रूप में प्रतिनिधित्व किया है।
क्या कोई भी नेतृत्व कर सकता है?
दूसरा, मैं हास्केल के Control.Monad.Trans.Cont
का उपयोग करके get
को कैसे कार्यान्वित करना चाहता हूं? मुझे टाइप सिस्टम को आराम देने में समस्याएं आ रही हैं।
अद्यतन
ऐसा लगता है मैं एक दूसरे मिल गया:
Prelude Control.Monad.Trans.Cont> let get() = shift $ \k -> return $ \i -> k i i
लेकिन मैं अभी भी नहीं मिलता है कारण है कि मैं जारी रखने के लिए दो बार राज्य आवेदन करना होगा।
@ बर्गि इसे वास्तव में ओचाकैम कहा जाता है। मैं ट्यूटोरियल का अनुसरण कर रहा हूं लेकिन मुझे नहीं लगता कि उपयोग में आने वाली भाषाएं इस मामले में अवधारणा की समझ को प्रभावित करती हैं। – HuStmpHrrr