۲۱ - ۸ریدِر مونَد به تنهایی جذاب نیست

قابلیتی نداره که ‏‎Applicative‎‏ هم نداشته باشه.

{-# LANGUAGE NoImplicitPrelude #-}

module PrettyReader where

flip :: (a -> b -> c) -> (b -> a -> c)
flip f a b = f b a

const :: a -> b -> a
const a b = a

(.) :: (b -> c) -> (a -> b) -> (a -> c)
f . g = \a -> f (g a)

class Functor f where
  fmap :: (a -> b) -> f a -> f b

class Functor f => Applicative f where
  pure :: a -> f a
  (<*>) :: f (a -> b) -> f a -> f b

class Applicative f => Monad f where
  return :: a -> f a
  (>>=) :: f a -> (a -> f b) -> f b

instance Funtor ((->) r) where
  fmap = (.)

instance Applicative ((->) r) where
  pure = const
  f <*> a = \r -> f r (a r) 

instance Monad ((->) r) where
  return = pure
  m >>= k = flip k <*> m

با جبرها به تنهایی نمیشه از نمونه ‏‎Applicative‎‏ به نمونه ِ ‏‎Monad‎‏ رسید. اما از نمونه ِ ‏‎Monad‎‏ میشه ‏‎Applicative‎‏ گرفت. با همه‌ی اینها، نمونه‌هایی که بالا تعریف کردیم برای یه تایپِ انتزاعی نیستن؛ می‌دونیم که برای تایپِ تابع‌اند. چون زیر یه نیوتایپ ‏‎Reader‎‏ مخفی نشده، تونستیم با استفاده از ‏‎flip‎‏ و اَپلای نمونه ِ ‏‎Monad‎‏ رو درست کنیم. باید اول اطلاعاتِ مشخص از تایپ داشته باشیم تا قابلیت‌های ‏‎Applicative‎‏ رو تعریف کنیم و نهایتاً بتونیم نمونه ِ ‏‎Monad‎‏ داشته باشیم.