तो मैं हाल ही में इस स्वच्छ विचार आया के सभी मामलों को कवर, सख्त और आलसी State
ट्रांसफार्मर मॉड्यूल के बीच साझा करने कोड की आशा में:एक पदोन्नत डेटाप्रकार
{-# LANGUAGE FlexibleInstances, DataKinds, KindSignatures #-}
module State where
data Strictness = Strict | Lazy
newtype State (t :: Strictness) s a = State (s -> (s, a))
returnState :: a -> State t s a
returnState x = State $ \s -> (s, x)
instance Monad (State Lazy s) where
return = returnState
State ma >>= amb = State $ \s -> case ma s of
~(s', x) -> runState (amb x) s'
instance Monad (State Strict s) where
return = returnState
State ma >>= amb = State $ \s -> case ma s of
(s', x) -> runState (amb x) s'
get :: State t s s
get = State $ \s -> (s, s)
put :: s -> State t s()
put s = State $ \_ -> (s,())
आप देख सकते हैं कि get
और put
बिना किसी नकल के दोनों काम - कोई प्रकार के वर्ग के उदाहरण, कुछ भी नहीं - दोनों सख्त और आलसी प्रकारों पर। FlexibleContexts
की आवश्यकता होती है यद्यपि
-- from http://blog.melding-monads.com/2009/12/30/fun-with-the-lazy-state-monad/
pro :: State t [Bool]()
pro = do
pro
s <- get
put (True : s)
-- No instance for (Monad (State t [Bool])) arising from a do statement
निम्नलिखित काम करता है ठीक,:: फिर
pro :: (Monad (State t [Bool])) => State t [Bool]()
-- otherwise as before
मैं हालांकि, भले ही मैं Strictness
के लिए दोनों संभव मामलों को कवर किया, मैं एक इकाई उदाहरण State t s a
के लिए सामान्य रूप में नहीं है t
Lazy
या Strict
पर तुरंत चालू कर सकते हैं और परिणाम चला सकते हैं और मुझे उम्मीद है कि मैं क्या उम्मीद कर सकता हूं। लेकिन मुझे यह संदर्भ क्यों देना है? क्या यह एक वैचारिक सीमा है, या एक व्यावहारिक है? क्या मुझे कोई कारण नहीं है कि Monad (State t s a)
वास्तव में क्यों नहीं पकड़ता है, या फिर अभी तक जीएचसी को मनाने के लिए कोई रास्ता नहीं है?
(एक तरफ: संदर्भ Monad (State t s)
का उपयोग कर नहीं काम:।
Could not deduce (Monad (State t [Bool])) arising from a do statement
from the context (Monad (State t s))
जो सिर्फ मुझे और भी अधिक निश्चित रूप से पूर्व confuses बाद से निगम्य है?)
यह वास्तव में 'डेटाकिंड्स 'की सीमा है। मैंने कुछ संबंधित घटना देखी है, जहां जीएचसी यह नहीं समझ सका कि 'डेटाकिंड्स' के साथ जीएडीटी के पैटर्न संपूर्ण थे, और इससे ऐसे सुझाव उत्पन्न हुए जो टाइप-चेक नहीं करेंगे। –