Подтвердить что ты не робот

Как вызвать Redis StringSet() из F #

Я использую StackExchange.Redis для доступа к экземпляру Redis.

У меня есть следующий рабочий код С#:

public static void Demo()
{
    ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("xxx.redis.cache.windows.net,ssl=true,password=xxx");

    IDatabase cache = connection.GetDatabase();

    cache.StringSet("key1", "value");
}

Вот то, что я надеюсь, будет эквивалентным кодом F #:

let Demo() =
   let cx = ConnectionMultiplexer.Connect @"xxx.redis.cache.windows.net,ssl=true,password=xxx"
   let cache = cx.GetDatabase()
   cache.StringSet("key1", "value") |> ignore

Однако это не скомпилируется - "Нет перегрузки для метода StringSet". Метод StringSet ожидает аргументы типа RedisKey и RedisValue, и, похоже, в С# существует некоторая маска компилятора для преобразования строк в вызывающем коде в RedisKey и RedisValue. Магия, похоже, не существует в F #. Есть ли способ достичь того же результата?

4b9b3361

Ответ 1

Вот рабочий код, большое спасибо @Daniel:

open StackExchange.Redis
open System.Collections.Generic

let inline (~~) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit: ^a -> ^b) x)

let Demo() =
   let cx = ConnectionMultiplexer.Connect @"xxx.redis.cache.windows.net,ssl=true,password==xxx"
   let cache = cx.GetDatabase()

   // Setting a value - need to convert both arguments:
   cache.StringSet(~~"key1", ~~"value") |> ignore

   // Getting a value - need to convert argument and result:
   cache.StringGet(~~"key1") |> (~~) |> printfn "%s"