ابتدای محتوای صفحه
۱۸ - ۷تمرینهای فصل
برای تایپهای زیر نمونه ِ Monad
بنویسین. با مشخصههای QuickCheck
که نشون دادیم نمونههاتون رو تست کنین.
۱.
به Nope Monad
خوش اومدین، جایی که هیچ اتفاقی نمیوفته و هیچکس هم اهمیت نمیده.
data Nope a =
NopeDotJpg
-- .جدی میگیم. بنویسینش
۲.
data PhhhbbtttEither b a =
Left a
| Right b
۳.
یه نمونه ِ Monad
برای Identity
بنویسین.
newtype Identity a = Identity a
deriving (Eq, Ord, Show)
instance Functor Identity where
fmap = undefined
instance Applicative Identity where
pure = undefined
(<*>) = undefined
instance Monad Identity where
return = pure
(>>=) = undefined
۴.
این احتمالاً از نمونه ِ Applicative
ِش سادهتر باشه. از Functor
ای استفاده کنین که Monad
لازمش داره، و از اونجا ادامه بدین.
data List a =
Nil
| Cons a (List a)
توابعِ زیر رو با استفاده از متودهای Monad
و Functor
بنویسین. استفاده از چیزهایی مثلِ همانی و ترکیب هم ایرادی نداره، اما حتماً با تایپهای داده شده تایپچک بشه:
۱.
j :: Monad m => m (m a) -> m a
-- رفتار مورد نظر
Prelude> j [[1, 2], [], [3]]
[1,2,3]
Prelude> j (Just (Just 1))
Just 1
Prelude> j (Just Nothing)
Nothing
Prelude> j Nothing
Nothing
۲.
l1 :: Monad m => (a -> b) -> m a -> m b
۳.
l2 :: Monad m
=> (a -> b -> c) -> m a -> m b -> m c
۴.
a :: Monad m => m a -> m (a -> b) -> m b
۵.
-- لازم دارین recursion برای این یکی
meh :: Monad m
=> [a] -> (a -> m b) -> m [b]
۶.
-- استفاده کنین meh راهنمایی: از
flipType :: (Monad m) => [m a] -> m [a]