ابتدای محتوای صفحه
۲۲ - ۸تمرینهای فصل
به کمک 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
واحد میده.