0

我想做的是有一个函数,我可以重复将转换函数传递给并接收组合转换,转换函数的形式为'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)

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

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

4

1 回答 1

3

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

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"    
于 2011-06-12T09:58:26.190 回答