۲۲ - ۸تمرین‌های فصل

به کمک ‏‎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‎‏ واحد میده.