我想要做的是有一个函数,我可以重复将转换函数传递到并接收组合转换,转换函数的形式为'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)
然后我可以简单地调用组合输入来获取工作流的结果。
如果没有达到值限制,或者编译器将所有变换器限制为相同的类型,这是否可行?
答案 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"