s
ST
मोनैड ST
मोनैड के बाहर लीक करने से वस्तुओं को रखता है।
-- This is an error... but let's pretend for a moment...
let a = runST $ newSTRef (15 :: Int)
b = runST $ writeSTRef a 20
c = runST $ readSTRef a
in b `seq` c
ठीक है, यह एक प्रकार की त्रुटि है (जो एक अच्छी बात है! हम नहीं STRef
मूल गणना के बाहर लीक करने के लिए चाहते हैं!)। अतिरिक्त s
की वजह से यह एक प्रकार की त्रुटि है। याद रखें कि runST
हस्ताक्षर हैं:
runST :: (forall s . ST s a) -> a
इसका मतलब यह है अभिकलन जिसे आप चला रहे पर s
यह बगैर किसी अड़चन के लिए है। तो जब आप a
मूल्यांकन करने के लिए प्रयास करें:
a = runST (newSTRef (15 :: Int) :: forall s. ST s (STRef s Int))
परिणाम प्रकार STRef s Int
है, जो गलत है के बाद से s
forall
के बाहर "बच गए" है runST
में होगा। प्रकार चर हमेशा forall
के अंदर दिखाई देते हैं, और हास्केल हर जगह 0.क्वांटिफ़ायर को निहित करता है। बस कोई नियम नहीं है जो आपको a
के वापसी प्रकार को अर्थपूर्ण रूप से समझने की अनुमति देता है।
forall
साथ एक और उदाहरण:
f :: (forall a. [a] -> b) -> Bool -> b
f g flag =
if flag
then g "abcd"
else g [1,2]
> :t f length
f length :: Bool -> Int
> :t f id
-- error --
पाठ्यक्रम f id
के
, एक त्रुटि है, क्योंकि यह वापसी होगी: स्पष्ट रूप से दिखाने के आप चीजों को एक forall
से बचने के लिए अनुमति नहीं दे सकते क्यों के लिए, यहाँ एक सरल उदाहरण है या तो बूलियन सत्य या गलत है या नहीं, इस पर निर्भर करता है कि Char
की सूची या Int
की एक सूची। यह बस गलत है, उदाहरण के साथ ST
के साथ।
दूसरी ओर, अगर आप s
प्रकार पैरामीटर नहीं था तो सब कुछ ठीक जाँच, भले ही कोड स्पष्ट रूप से सुंदर फर्जी है टाइप करेंगे।
कैसे अनुसूचित जनजाति वास्तव में काम करता है: कार्यान्वयन के लिहाज से, ST
इकाई वास्तव में IO
इकाई के रूप में, लेकिन एक अलग इंटरफेस के साथ एक ही है। जब आप ST
मोनड का उपयोग करते हैं तो आपको वास्तव में दृश्यों के पीछे unsafePerformIO
या समकक्ष मिलता है। कारण आप इसे सुरक्षित रूप से कर सकते हैं क्योंकि ST
-संबंधित कार्यों के प्रकार हस्ताक्षर के कारण, विशेष रूप से forall
के साथ भाग।
यदि आप "एसटी मोनाड" की खोज करते हैं, तो एक प्रविष्टि है इस तरह के उत्तर STArrays के बारे में एक प्रश्न के पक्ष के जवाब के रूप में मेरे सवाल का जवाब देते हैं। निश्चित नहीं है कि मेरा प्रश्न यहां एक डुप्लिकेट है। http://stackoverflow.com/questions/8197032/starray- दस्तावेज-for- newbies-and-state-st-related-questions – David
बस "हां" का उत्तर देने के लिए यह बहुत मोहक है। आपके प्रश्न के लिए :) – AndrewC
मुझे लगता है कि प्रश्न के लिए एक लिंक जोड़ना और इसे बंद करना होगा ए) भविष्य में इस के लिए खोज करना आसान होगा, और बी) कुछ उत्तरदाताओं को कुछ समय बचाएं। – David