不能完全確定標題所描述的那樣好,但我也有關於下面的代碼:計算表達式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 ... –