在其他工作流程/ monad中嵌入工作流程/ monad?

时间:2014-12-08 15:10:03

标签: f# computation-expression

例如,我有一个日志记录工作流程,我想在日志记录工作流程中使用async。如何在异步工作流程中调用日志记录bind

log {
    async {
       let! a = .... // Need to do logging here.
       let! b = .... // Need to do async here

编辑:我听说在F#中使用工作流替换AOP以实现横切关注目的是个好主意。我不知道如何处理嵌入问题。或者使用工作流程并不是一个好主意?

2 个答案:

答案 0 :(得分:5)

F#没有任何自动执行此操作的方法。你真正想要的是创建一个捕获两种不同行为的组合计算。执行此操作的最佳方法是定义一个新计算,例如asyncLog,它可以让您执行所需的两项操作。这并不容易,但以下是很好的起点:

实际上,您不需要经常在F#中执行 ,因为没有那么多的计算表达式可以编写。

在您的示例中,您使用的是asynclog。尽管在解释计算表达式如何工作时,日志记录是一个很棒的演示,但我不确定在实践中是否会使用计算表达式向我的应用程序添加日志记录 - 使用全局记录器对象并直接调用它似乎更容易(但这实际上取决于你的log计算在封面背后的作用。)

答案 1 :(得分:1)

您可以对此https://github.com/jack-pappas/ExtCore/blob/master/ExtCore/Control.fs#L1769使用AsyncReader计算表达式,并在需要时提升Asyncs和Readers。