Functor产品和副产品的有用应用

ais*_*ais 7 haskell functor category-theory

你能展示一个简单的代码示例,它会显示Data.Functor's ProductCoproduct?的有用应用吗?

Cac*_*tus 9

ProductConstReader可以用来容易地实现两阶段的评价.例如,假设您需要在两个阶段之间使用一些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
Run Code Online (Sandbox Code Playgroud)

请注意,这当然只允许ApplicativeAPI 的接口,而不是monadic接口; 但这就是你在这种情况下通常想要的东西.

  • 这种表示形式是我们最终使用(而不是免费的应用程序构造)来实现[这些想法](http://gergo.erdi.hu/blog/2012-12-01-static_analysis_with_applicatives/). (2认同)