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

برای تایپ‌های زیر نمونه ِ ‏‎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]