Не совсем уверен, что название описывает это хорошо, но у меня есть примерно следующий код:Расчетные выражения против аппликативных функторов и то, что не
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, но использовал операторов (аппликаторы?), Но я в настоящий момент не могу повернуть голову, чтобы справиться с этим.
Приведенный выше код компилируется, но подписи для 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, но я более или менее всегда заканчивается на той же подписью, как указано выше.
Общая идея, которую я изначально имела, заключалась в том, чтобы написать небольшую функцию, делающую то, что им нужно, а затем добавить обработку исключений (защищать), а затем «обернуть» и «развернуть» соответственно.
Это, конечно, не совсем правильная идея.
Могут ли кто-нибудь указать мне несколько направлений здесь для дальнейших исследований, примеров кода или чего-нибудь еще? Любые комментарии любого типа на самом деле прием в этот момент ;-)
Добавление
Я думаю, что следующий должен быть примерно такой же, как и выше, но без зависимостей 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, чтобы исследовать этот вопрос ... –
BTW, в F # '' часто используется вместо Haskell '<$>', который не является юридическим оператором в F #. Это просто инфиксная версия 'map' (' fmap' в Haskell). –
@MarkSeemann хе-хе. это на самом деле MCVE. или то есть: нет необходимости возиться с монго здесь ;-) вышеупомянутый бег без монгодба, установленного или любого возиться вообще, если пакеты на месте. но я постараюсь сделать еще кое-что в кости MCVE ... –