你能展示一个简单的代码示例,它会显示Data.Functor
's Product
和Coproduct
?的有用应用吗?
甲Product
的Const
和Reader
可以用来容易地实现两阶段的评价.例如,假设您需要在两个阶段之间使用一些monadic效果,但是您希望确保您的客户端代码不能这样做(因为您希望精确控制它发生的方式和时间):
type TwoPhase c r = Product (Const c) (Reader r) run :: (Monad m, Monoid c) => (c -> m r) -> TwoPhase c r a -> m a run prepare (Pair (Const deps, phase2)) = do r <- prepare deps return $ runReader phase2 r
请注意,这当然只允许Applicative
API 的接口,而不是monadic接口; 但这就是你在这种情况下通常想要的东西.