Size: a a a

2021 January 08

AK

Aleksandr Kazantsev in F# Chat
Aleksandr Kazantsev
не знаю , насколько понятнее , но вот вариант :
 
getCacheValue key
|> Option.orElseWith ( fun _  ->
     async {
           let! newValue = fetchValue key
           newValue |>  Option.iter (setCacheValue key)
           return newValue
     } |> Async.RunSynchronously
)
но лучше наверное так , если тебе нужно весь метод в асинк заворачивать
async {
     match  getCacheValue key with
     | Some value -> return (Some value)
     | _ ->
         let! newValue = fetchValue key
         newValue |>  Option.iter (setCacheValue key)
         return newValue
   }
источник

g

gsomix in F# Chat
Евгений Бурмистров
здравствуйте. есть у меня такой кусочек:

    let getValue key =
       async {
           let value = getCacheValue key
           match value with
           | Some v -> return Some v
           | None ->
               let! newValue = fetchValue key
               match newValue with
               | None -> return None
               | Some nv ->
                   setCacheValue key nv |> ignore
                   return Some nv
       }
вопроса два
- можно ли переписать на всякие Option.orElse и Option.bind? я внутри CE спотыкаюсь об return'ы
- нужно ли? или как есть паттерн матчингом лучше\красивее\понятнее
Я бы предложил разбить на две функции, в каждой по одному матчу.
источник

ЕБ

Евгений Бурмистров... in F# Chat
спасибо, выглядит действительно странновато, попробую на две разбить
источник

SN

Shub Niggurath in F# Chat
Евгений Бурмистров
спасибо, выглядит действительно странновато, попробую на две разбить
Еще есть Option.map
источник

ЕБ

Евгений Бурмистров... in F# Chat
да, тут не bind, а map больше подошли бы
источник

ЕБ

Евгений Бурмистров... in F# Chat
но я в итоге как @gsomix посоветовал сделал - разбил на две функции и успокоился
источник

ЕБ

Евгений Бурмистров... in F# Chat
    let fetchAndCacheValue key =
       async {
           let! newValue = fetchValue key
           match newValue with
           | None -> return None
           | Some nv ->
               setCacheValue key nv |> ignore
               return Some nv
       }

   let getValue key =
       let value = getCacheValue key
       match value with
       | Some v -> Some v
       | None -> fetchAndCacheValue key |> Async.RunSynchronously
источник

g

gsomix in F# Chat
Евгений Бурмистров
    let fetchAndCacheValue key =
       async {
           let! newValue = fetchValue key
           match newValue with
           | None -> return None
           | Some nv ->
               setCacheValue key nv |> ignore
               return Some nv
       }

   let getValue key =
       let value = getCacheValue key
       match value with
       | Some v -> Some v
       | None -> fetchAndCacheValue key |> Async.RunSynchronously
Зачем Async.RunSynchronously?
источник

ЕБ

Евгений Бурмистров... in F# Chat
ну или опять в CE завернуть
источник

g

gsomix in F# Chat
Это же блокировка посреди программы!
источник

SN

Shub Niggurath in F# Chat
gsomix
Это же блокировка посреди программы!
You shall not pass! 🧙‍♂️
источник

NK

ID:0 in F# Chat
источник

VP

Vitalii Panchenko in F# Chat
Народ а как из С# получить список типов из F# проекта ?
источник

АП

Артем Просвирнин... in F# Chat
источник

VP

Vitalii Panchenko in F# Chat
не работает
источник

VS

Vasily Shapenko in F# Chat
Задача не очень понятна
источник

VP

Vitalii Panchenko in F# Chat
хочу из С# достать все рекорды в либе которая на F#
источник

VP

Vitalii Panchenko in F# Chat
Assembly.GetExecutingAssembly().GetTypes() не работает
источник

VS

Vasily Shapenko in F# Chat
Стесняюсь задать следующий вопрос
источник

VP

Vitalii Panchenko in F# Chat
зачем ?
источник