আমি কিছুটা বিভিন্ন ধরণের রাজ্য সহ রাষ্ট্রীয় মেশিনগুলির একটি পরিবারকে সংজ্ঞায়িত করার চেষ্টা করছি। বিশেষত, আরও "জটিল" রাষ্ট্রীয় মেশিনগুলিতে এমন রাজ্য রয়েছে যা সরল রাষ্ট্র মেশিনগুলির রাজ্যগুলিকে একত্রিত করে গঠিত হয়।
(এটি কোনও অবজেক্ট ওরিয়েন্টেড সেটিংয়ের মতো যেখানে কোনও বস্তুর বিভিন্ন বৈশিষ্ট্য রয়েছে যা বস্তুও।
আমি কী অর্জন করতে চাই তার একটি সরল উদাহরণ এখানে।
data InnerState = MkInnerState { _innerVal :: Int }
data OuterState = MkOuterState { _outerTrigger :: Bool, _inner :: InnerState }
innerStateFoo :: Monad m => StateT InnerState m Int
innerStateFoo = do
i <- _innerVal <$> get
put $ MkInnerState (i + 1)
return i
outerStateFoo :: Monad m => StateT OuterState m Int
outerStateFoo = do
b <- _outerTrigger <$> get
if b
then
undefined
-- Here I want to "invoke" innerStateFoo
-- which should work/mutate things
-- "as expected" without
-- having to know about the outerState it
-- is wrapped in
else
return 666
আরও সাধারণভাবে, আমি একটি সাধারণ কাঠামো চাই যেখানে এই নীড়গুলি আরও জটিল। এখানে আমি কীভাবে করতে চাই তা জানতে চাই।
class LegalState s
data StateLess
data StateWithTrigger where
StateWithTrigger :: LegalState s => Bool -- if this trigger is `True`, I want to use
-> s -- this state machine
-> StateWithTrigger
data CombinedState where
CombinedState :: LegalState s => [s] -- Here is a list of state machines.
-> CombinedState -- The combinedstate state machine runs each of them
instance LegalState StateLess
instance LegalState StateWithTrigger
instance LegalState CombinedState
liftToTrigger :: Monad m, LegalState s => StateT s m o -> StateT StateWithTrigger m o
liftToCombine :: Monad m, LegalState s => [StateT s m o] -> StateT CombinedState m o
প্রসঙ্গে, আমি এই যন্ত্রপাতিটির সাথে এটি অর্জন করতে চাই:
আমি এই জিনিসগুলিকে "স্ট্রিম ট্রান্সফর্মারস" নামে ডিজাইন করতে চাই, যা মূলত রাষ্ট্রীয় কাজ: তারা একটি টোকেন গ্রাস করে, তাদের অভ্যন্তরীণ অবস্থা এবং আউটপুটকে কিছু পরিবর্তিত করে। বিশেষত, আমি স্ট্রিম ট্রান্সফর্মারগুলির একটি শ্রেণিতে আগ্রহী যেখানে আউটপুটটি বুলিয়ান মান; আমরা এই "মনিটর" কল করব।
এখন, আমি এই বিষয়গুলির জন্য কম্বিনেটর ডিজাইনের চেষ্টা করছি। এর মধ্যে কয়েকটি হ'ল:
- একটি
pre
সমন্বয়কারী। ধরা যাক এটিmon
মনিটর। তারপরে,pre mon
এমন কোনও মনিটর যা সর্বদাFalse
প্রথম টোকেন গ্রহণ করার পরে উত্পাদন করে এবং তার আচরণের নকল করেmon
যেন আগের টোকেনটি এখন sertedোকানো হচ্ছে। আমি উপরের উদাহরণেরpre mon
সাথে রাজ্যের মডেল করতে চাইStateWithTrigger
যেহেতু নতুন রাষ্ট্র মূল রাষ্ট্রের সাথে বুলিয়ান। - একটি
and
সমন্বয়কারী। মনে করুন যেm1
এবংm2
মনিটর হয়। তারপরে,m1 `and` m2
এমন একটি মনিটর যা এম 1 এবং তারপরে এম 2 তে টোকেনটি ফিড করে এবং তারপরেTrue
উত্তর দুটিই সত্য বলে প্রমাণিত হয় produces উভয় মনিটরের রাজ্য বজায় রাখতে হবে বলে আমি উপরের উদাহরণেরm1 `and` m2
সাথে রাজ্যের মডেল করতে চাইCombinedState
।
StateT InnerState m Int
প্রথম স্থানে একটি মান পাচ্ছেন outerStateFoo
?
_innerVal <$> get
ঠিকgets _innerVal
(যেমনgets f == liftM f get
, এবংliftM
কেবলfmap
মনদেদের কাছে বিশেষায়িত)।