【发布时间】:2023-03-04 08:30:01
【问题描述】:
我正在尝试为一个类型定义一个 monad 的实例,其定义如下:
type Error a = Either String a
data Outer a = Outer { fromOuter :: Error (Maybe a) }
Outer 类型的 Functors 和 Applicative 实例可以定义为:
instance Functor Outer where
f `fmap` (Outer fa) = Outer $ fmap (fmap f) $ fa
instance Applicative Outer where
pure = Outer . pure . pure
(Outer l) <*> (Outer r) = Outer $ do
el <- l
er <- r
return $ el <*> er
但是,我正在努力定义 bind 来为这种类型定义 Monad 实例:
instance Monad Outer where
return = pure
(Outer l) >>= f = ??????
另一个问题是:
如何将上述内容概括为,例如,
data Outer m n a = Outer { fromOuter :: m (n a) }
这个问题是hedis-simple 中一个问题的抽象,我试图为RedisTx 定义 Monad 实例
【问题讨论】:
-
不幸的是,monad 不会组合。你发现了一个Monad Transformer
-
似乎 hedis-simple 定义 RedisTx 的方式是不可能为其编写 monad 实例。我想知道是否可以做出更简单的设计决策。