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