问题描述
|
我想做的是有一个函数,我可以反复将转换函数传递给它并接收组合的转换,该转换函数的形式为\'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)
因此,我可以简单地调用组合输入来获取工作流程的结果。
在没有达到值限制的情况下,或者编译器将所有转换器限制为相同类型,这是否有可能?
解决方法
我不太确定是否收到您的问题,您是否需要将类似于(>>)运算符的内容应用于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\"