当我Composing Types从Haskell Book 学习章节时,我被赋予编写以下类型的Functor和Applicative实例的任务。
newtype Compose f g a = Compose { getCompose :: f (g a) }
Run Code Online (Sandbox Code Playgroud)
我写了以下定义
fmap f (Compose fga) = Compose $ (fmap . fmap) f fga
Run Code Online (Sandbox Code Playgroud)
(Compose f) <*> (Compose a) = Compose $ (<*>) <$> f <*> a
Run Code Online (Sandbox Code Playgroud)
我了解到,组成两个Functor或Applicatives分别会给Functor和Applicative。
作者还解释说,不可能以相同的方式组成两个Monad。因此,我们使用Monad变形金刚。我只是不想阅读Monad Transformers,除非我清楚为什么Monad不作曲。
到目前为止,我尝试编写如下bind函数:
(>>=) :: Compose f g a -> (a -> Compose f g b) -> Compose f g b
(Compose fga) >>= h = (fmap.fmap) h …Run Code Online (Sandbox Code Playgroud)