۲۲ - ۶خودتون State بنویسین

با همون تعریفی که اول فصل آوردیم شروع کنین، فقط اگه از کتابخونه ِ ‏‎transformers‎‏ یا ‏‎mtl‎‏ تایپِ ‏‎State‎‏ رو وارد کردین از یه اسمِ دیگه استفاده کنین تا تداخلی پیش نیاد. ما اینجا اسم‌ش رو گذاشتیم ‏‎Moi‎‏ چون کنایه به نقل‌قول‌های معروف رو دوست داریم*؛ ولی اگه دوست داشتین تغییرش بدین.

newtype Moi s a =
  Moi { runMoi :: s -> (a, s) }
*

به نقل‌قول (احتمال زیاد جعلی) منسوب به شاه لوئیِ چهاردهم فرانسوی اشاره داریم: ‏‎“L’Etat, c’est moi”‎‏. که به انگلیسی میشه ‏‎“I am the State”‎‏ (م. لغت State علاوه بر حالت، معنای ایالت یا دولت هم میده، پس ترجمه‌ی اون نقل‌قول میشه "من دولت هستم").

‏‎State Functor‎‏

نمونه ِ ‏‎Functor‎‏ برای ‏‎State‎‏ رو تعریف کنین.

instance Functor (Moi s) where
  fmap :: (a -> b) -> Moi s a -> Moi s b
  fmap f (Moi g) = ???
Prelude> runMoi ((+1) <$> (Moi $ \s -> (0, s))) 0
(1,0) 

‏‎State Applicative‎‏

نمونه ِ ‏‎Applicative‎‏ برای ‏‎State‎‏ رو تعریف کنین.

instance Applicative (Moi s) where
  pure :: a -> Moi s a
  pure a = ???

  (<*>) :: Moi s (a -> b)
        -> Moi s a
        -> Moi s b
  (Moi f) <*> (Moi g) =
    ???

‏‎State Monad‎‏

نمونه ِ ‏‎Monad‎‏ برای ‏‎State‎‏ رو تعریف کنین.

instance Monad (Moi s) where
  return = pure

  (>>=) :: Moi s a
        -> (a -> Moi s b)
        -> Moi s b
  (Moi f) >>= g =
    ???