ابتدای محتوای صفحه
۲۲ - ۸تمرینهای فصل
به کمک State ای که تعریف کردین (به همراهِ Functor، Applicative، و Monad ِش)، توابعِ زیر رو بنویسین.
۱.
یه State درست میکنه که مقدارِ خروجیش همون حالت ِش باشه.
get :: State s s
get = ???خروجی مطلوب:
Prelude> runState get "curryIsAmaze"
("curryIsAmaze","curryIsAmaze")۲.
یه State درست میکنه که حالت ِ خروجیش با یه آرگومان تعیین میشه و مقدارش واحد ِه.
put :: s -> State s ()
put = ???Prelude> runState (put "blah") "woot"
((),"blah")۳.
State رو با s اجرا میکنه، و حالت ِ خروجی رو برمیگردونه.
exec :: State s a -> s -> s
exec (State sa) s = ???Prelude> exec (put "wilma") "daphne"
"wilma"
Prelude> exec get "scooby papu"
"scooby papu"۴.
State رو با s اجرا میکنه، و مقدارِ خروجی رو برمیگردونه.
eval :: State s a -> s -> a
eval (State sa) s = ???Prelude> eval get "bunnicula"
"bunnicula"
Prelude> eval get "stake a bunny"
"stake a bunny"۵.
تابعی بنویسین که تابعی رو اعمال میکنه تا یه State ِ جدید بسازه.
modify :: (s -> s) -> State s ()
modify = undefinedباید چنین رفتاری داشته باشه:
Prelude> runState (modify (+1)) 0
((),1)
Prelude> runState (modify (+1) >> modify (+1)) 0
((),2)لازم نیست ترکیب بشن، چون درهرصورت برای a واحد میده.