완전히 확실하지 :계산의 실용적 펑 대 표현하고 무엇을하지
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과 비슷하지만 연산자 (applicants?)를 사용하도록 GetDB2를 작성하는 것이었지만 지금은이를 관리하기 위해 머리를 틀 수 없습니다.
위의 코드는 컴파일하지만 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에서 여러 가지 버전과 작업을 시도했지만 위와 같은 서명으로 끝을 맺습니다.
내가 처음에 생각해 보았던 일반적인 생각은 작은 기능을 작성해야만 예외 처리 (보호)를 추가 한 다음 이에 따라 "랩핑"및 "언랩"합니다.
당연히 그렇게 생각지도 못할 수도 있습니다.
향후 연구, 코드 예제 또는 다른 용도로 누군가가 여기를 지시 할 수 있습니까? 모든 유형의 모든 의견이 시점 ;-)
부록 I 생각
에서 실제로 환영에있는하지만 MongoDB의 종속성없이, 상기와 거의 동일해야합니다 다음과 같습니다. 당신이 map
인 <!>
연산자를 사용했기 때문에
#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를 만지작 거리고 싶지 않다 ... –
BTW, F #''은 하스켈의'<$> '대신에 사용된다.이 연산자는 F #에서 합법적 인 연산자가 아니다. 이것은'map'의 중위 버전입니다 (하스켈에서'fmap'). –
@ MarkSeemann hehe. 그것은 사실 MCVE입니다. 또는 그것은 다음과 같습니다 : 여기에 몽고와 함께 할 필요가 없습니다 ;-) 위의 실행은 mongodb가 설치되지 않았거나 pakets이 제자리에있는 경우 전혀 동작하지 않습니다. 그러나 나는 뼈 MCVE에 더 많은 것을하려고 노력할 것이다. ... –