5

मैं इस 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 

लेकिन मैं अभी भी नहीं मिलता है कारण है कि मैं जारी रखने के लिए दो बार राज्य आवेदन करना होगा।

+0

@ बर्गि इसे वास्तव में ओचाकैम कहा जाता है। मैं ट्यूटोरियल का अनुसरण कर रहा हूं लेकिन मुझे नहीं लगता कि उपयोग में आने वाली भाषाएं इस मामले में अवधारणा की समझ को प्रभावित करती हैं। – HuStmpHrrr

उत्तर

3

आप state पर k लागू दो बार पहले एक get() का परिणाम और दूसरा एक के बाद राज्य गुजर से मेल खाती है (हम get के प्रभाव वर्तमान स्थिति पुन: प्राप्त करने और परिणाम के रूप में यह लौटने होना चाहते हैं) से मेल खाती है क्योंकि get (जो, get राज्य को नहीं बदलता है, get से पहले राज्य के समान है) अगले राज्य गणना में।

दूसरे शब्दों में, के बाद से राज्य इकाई State s a ~ s -> (a, s) है, इसका सीपीएस संस्करण State s r a ~ s -> (a -> s -> r) -> r है, और इसलिए get : State s s के लिए, क्योंकि a ~ s, निरंतरता प्रकार s -> s -> r के एक समारोह होगा।

+0

वह मुख्य हिस्सा है जो मुझे नहीं मिलता है। क्या मौजूदा स्थिति को पारित करके निरंतरता पर्याप्त होनी चाहिए?मुझे यह भी समझ में नहीं आता कि कैसे राज्य मोनैड संस्करण से सीपीएस संस्करण में कदम उठाना है। – HuStmpHrrr

+0

मैं कोड को देखकर निरंतरता के प्रकार को कैसे जान सकता हूं? मुझे किस भाग को देखना चाहिए, छेद या छेद नहीं? – HuStmpHrrr

+0

इस बारे में सोचें कि आप क्या प्राप्त करना चाहते हैं यदि 'प्राप्त' का परिणाम वर्तमान स्थिति + 1 (उदाहरण के लिए 'राज्य Int' को ठीक करना) माना जाता है। बाद वाला राज्य अभी भी आने वाली स्थिति के समान होगा, लेकिन परिणाम अलग होगा। तो आपको निरंतरता के लिए नए राज्य तर्क के रूप में परिणाम तर्क के रूप में 'राज्य + 1' और 'राज्य' को पारित करने की आवश्यकता होगी। – Cactus

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