我该如何构建递归计算表达式构建器

时间:2011-06-12 08:55:24

标签: asynchronous f# computation-expression

我想要做的是有一个函数,我可以重复将转换函数传递到并接收组合转换,转换函数的形式为'a - > “B

即。而不是像这样构建一个固定的工作流程:

let input = async{ let! transform1 = transformAB input
                   let! transform2 = transformBC transform1
                   let! transform3 = transformCD transform2 
                   return! transform3 }

我希望能够做到这一点:

let combined = buildTransform(transform1).Next(transform2).Next(transform3)

然后我可以简单地调用组合输入来获取工作流的结果。

如果没有达到值限制,或者编译器将所有变换器限制为相同的类型,这是否可行?

1 个答案:

答案 0 :(得分:3)

我不太确定我是否收到了您的问题,您需要将(>>)运算符应用于Async吗?

open System

let f1 a = async { return Int32.Parse a }
let f2 a = async { return a = 10 }
let f3 a = async { return (not a).ToString() }

// async defined via workflow syntax
// string -> Async<string>
let result a = async {
    let! x1 = f1 a
    let! x2 = f2 x1
    let! x3 = f3 x2
    return x3
    }

Async.RunSynchronously (result "10")
|> printfn "%s"

let (|>>) f1 f2 arg = async {
    let! r = f1 arg
    return! f2 r
    }

// async defined with 'combine' operator
// string -> Async<string>
let combined = f1 |>> f2 |>> f3
Async.RunSynchronously (combined "10")
|> printfn "%s"