Functor 的 Product 和 Coproduct 的有用应用
The useful application of Functor's Product and Coproduct
您能否展示一个简单的代码示例来展示 Data.Functor
的 Product
和 Coproduct
的有用应用?
一个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中使用了余积函子的一个可能应用。这个想法是使用余积来组合 一级 数据类型构造函数。
您能否展示一个简单的代码示例来展示 Data.Functor
的 Product
和 Coproduct
的有用应用?
一个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中使用了余积函子的一个可能应用。这个想法是使用余积来组合 一级 数据类型构造函数。