ابتدای محتوای صفحه
۲۱ - ۸ریدِر مونَد به تنهایی جذاب نیست
قابلیتی نداره که 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 داشته باشیم.