全くわからない:計算の応用的ファンクタ対表現やものではありません
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」のポイントは、GetDB1と同じように動作するように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で物事の注文を試してみましたが、私は多かれ少なかれ常に上記と同じシグネチャで終了します。
私が最初に持っていた一般的なアイデアは、必要なものを実行し、例外処理(プロテクト)を追加し、それに応じて「ラップ」と「アンラップ」を行うことでした。
もちろん、まったく正しいアイデアではないかもしれません。
誰かが今後の調査、コード例など何かを指示することができますか?任意の型の任意のコメントは、この点;-)
補遺と思い
で実際に歓迎しているが、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# ''のBTWがよく使われます。これは単純に 'map'のインディックスバージョンです(Haskellの' fmap')。 –
@ MarkSeemann hehe。それは実際にはMCVEです。それは、ここでモンゴと仲良くする必要はありません;-)上記のランは、モンゴブがインストールされていない状態で実行されます。しかし、私は骨MCVEにいくつかもっとやろうとします... –