不完全确定标题描述它没问题,但我确实有以下代码:
paket.依赖项:
source https://www.nuget.org/api/v2
nuget fsharpx.extras
nuget mongodb.driver
一些.fsx:
#r @".\packages\MongoDB.Bson\lib\net45\MongoDB.Bson.dll"
#r @".\packages\MongoDB.Driver\lib\net45\MongoDB.Driver.dll"
#r @".\packages\MongoDB.Driver.Core\lib\net45\MongoDB.Driver.Core.dll"
#r @".\packages\FSharpX.Extras\lib\net45\FSharpX.Extras.dll"
open MongoDB
open MongoDB.Driver
open MongoDB.Bson
open MongoDB.Bson.Serialization
open FSharpx.Choice
let private createClient (connectString:string) = MongoClient(connectString)
let CreateClient = protect createClient
let private getDb name (client:IMongoClient) = client.GetDatabase(name)
let GetDB1 name client =
choose {
let! c = client
return! (protect (getDb name) c)
}
let GetDB2 name (client:Choice<IMongoClient, exn>) =
protect (getDb name)
<!> client
这个“练习”的重点是编写 GetDB2,使其与 GetDB1 一样,但使用运算符(应用程序?),但我目前无法转过头来管理它。
上面的代码可以编译,但是GetDB1和GetDB2的签名不相等,我显然做的不对。
val GetDB1 :
name:string ->
client:Choice<#MongoDB.Driver.IMongoClient,exn> ->
Choice<MongoDB.Driver.IMongoDatabase,exn>
val GetDB2 :
name:string ->
client:Choice<MongoDB.Driver.IMongoClient,exn> ->
Choice<Choice<MongoDB.Driver.IMongoDatabase,exn>,exn>
我已经在 GetDB2 中尝试了几个版本和命令,但我或多或少总是以与上面相同的签名结束。
我最初的总体想法是编写小函数来做他们应该做的事情,然后添加异常处理(protect),然后相应地“包装”和“解包”。
当然,这也可能不是完全正确的想法。
有人可以在这里为我指明一些方向以进行进一步的研究、代码示例或其他任何东西吗?实际上,此时欢迎任何类型的任何评论;-)
附录
我认为以下应该与上面大致相同,但没有 mongodb 依赖项。
#r @".\packages\FSharpX.Extras\lib\net45\FSharpX.Extras.dll"
type DataBase =
{
Name: string
}
type Client =
{
connectString: string
} with member this.GetDatabase name = {
Name = name
}
open FSharpx.Choice
let private createClient (connectString:string) = {
connectString= connectString
}
let CreateClient = protect createClient
let private getDb name (client:Client) = client.GetDatabase name
let GetDB1 name client =
choose {
let! c = client
return! (protect (getDb name) c)
}
let GetDB2 name client =
protect (getDb name)
<!> client