不能完全确定标题所描述的那样好,但我也有关于下面的代码:计算表达式VS合用的函子,什么不能
paket.dependencies:
source https://www.nuget.org/api/v2
nuget fsharpx.extras
nuget mongodb.driver
some.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
这个“excersise”的要点是编写GetDB2,使其与GetDB1一样,但使用运算符(applicatives?),但我目前无法转动头来管理它。
上面的代码编译,但对于 GetDB1和GetDB2签名是不相等的,和Im显然做的事情不权。
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
你可能会表示这是[MCVE](http://stackoverflow.com/help/mcve)?我不喜欢用MongoDB来研究这个问题...... –
顺便说一句,在F#中''经常用来代替Haskell的'<$>',它不是F#中的合法运算符。它仅仅是'map'的中缀版本(Haskell中的'fmap')。 –
@MarkSeemann hehe。它实际上是MCVE。或者就是:不需要在这里摆弄mongos ;-)上面的运行没有安装任何mongodb,或者根本没有任何的摆弄,如果这些包装已经就位。但我会尝试做一些更多的骨MCVE ... –