您能否展示一个简单的代码示例,该示例将显示Data.Functor
Product
和Coproduct
的有用应用程序?
答案 0 :(得分:9)
Product
和Const
的{{1}}可用于轻松实施两阶段评估。例如,假设您需要在两个阶段之间使用一些monadic效果,但是您希望确保您的客户端代码不能这样做(因为您想要精确控制它的发生方式和时间):
Reader
请注意,这当然只允许API的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
接口,而不是monadic接口;但这就是你在这种情况下通常想要的东西。
答案 1 :(得分:3)
Data types a la carte中使用了副产品仿函数的可能应用。我们的想法是使用coproducts组合一级数据类型构造函数。