我如何创建一个带参数的计算表达式?

Cha*_*ert 4 monads f#

我想创建几个用于访问数据库并返回项目列表的计算表达式(我在代码注释中也有问题):

let foo x y z = proc "foo" {
    let! cmd = proc.CreateCommand() // can I do this?
    do! In "x" DbType.Int32 // would i gain anything by replacing DbType with a union 
                            // type since the names would match actual data types?
    do! In "y" DbType.String 15;
    cmd?x <- x
    cmd?y <- y
    use! r = cmd.ExecuteReader() // would this be bad form for creating a workflow builder?
    return! r {
        let item = MyItem()
        do! item.a <- r.GetInt32("a")
        do! item.a <- r.GetString("b")
        do! item.c <- r.GetDateTime("c")
        yield! item
    }
}
Run Code Online (Sandbox Code Playgroud)

如何创建工作流构建器,使其实例采用参数?

let proc name = ProcedureBuilder(connStr, factory) // how do I do this?
Run Code Online (Sandbox Code Playgroud)

kvb*_*kvb 5

是的,你可以这样做.您可以在具有静态已知类型的任何表达式之后使用计算表达式语法来公开正确的方法.所以下面的代码可以工作(但没有做任何特别有趣的事情):

let f x = async
let v = f "test" { return 1 }
Run Code Online (Sandbox Code Playgroud)

这里f有类型'a -> AsyncBuilder,所以f "test"有类型AsyncBuilder,可以跟随计算表达式语法.你的例子let proc name = ProcedureBuilder(connStr, factory)非常好,假设它ProcedureBuilder被恰当地定义,尽管你可能想要name出现在构造函数参数中的某个地方.