Functor 的 Product 和 Coproduct 的有用应用

The useful application of Functor's Product and Coproduct

您能否展示一个简单的代码示例来展示 Data.FunctorProductCoproduct 的有用应用?

一个Product一个Const和一个Reader可以很容易的实现两阶段求值。例如,假设您需要在两个阶段之间使用一些单子效果,但您希望确保您的客户端代码不能这样做(因为您希望精细地控制它发生的方式和时间):

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,而不是单子接口;但在这种情况下,这就是你通常想要的。

Data types a la carte中使用了余积函子的一个可能应用。这个想法是使用余积来组合 一级 数据类型构造函数。