Является ли traverseBind признанной концепцией FP? - PullRequest
1 голос
/ 30 октября 2019

У меня есть функция f: 'a -> Async<'b option>, которую я хочу вызвать с 'a option вместо 'a. Теперь, если бы у меня была функция g, которая возвращала Async<'b> вместо f 'Async<'b option>, я мог бы написать стандартную реализацию traverse, и тогда в конце я бы получил Async<'b option>. Но если я использую traverse с f, результат будет Async<'b option option>.

Мне кажется, мне нужно что-то вроде этого:

module Option =

  let traverseBindAsync (f: 'a -> Async<'b option>) (opt: 'a option) : Async<'b option> =
    async {
      match opt with
      | None -> return None
      | Some x -> return! f x
    }

Я не думаю traverseBind - это признанная концепция (без результатов поиска). Известно ли это под другим именем или, альтернативно, есть ли другой способ думать об этом с точки зрения признанных концепций FP, которые можно выразить в F #? Если да, могу ли я использовать эти понятия более или менее синтаксически кратко, как указано выше Option.traverseBindAsync?

1 Ответ

3 голосов
/ 31 октября 2019

Я не знаю ни одного стандартного имени для функции такого типа. Тем не менее, есть два изменения, которые вы можете сделать в коде, который может быть несколько показателен. Во-первых, вы можете реализовать его без использования блока async, просто используя f x или возвращая async.Unit(None), то есть асинхронное вычисление, которое немедленно возвращает None:

let traverseBindAsync (f: 'a -> Async<'b option>) (opt: 'a option) : Async<'b option> =
  match opt with
  | None -> async.Return None
  | Some x -> f x

Теперь вы также можете переписать это, выполнив Option.map на входе и используя async.Return(None) в качестве значения по умолчанию, когда параметр ввода (а следовательно, и результат операции map) равен None:

let traverseBindAsync (f: 'a -> Async<'b option>) (opt: 'a option) : Async<'b option> =
  opt |> Option.map f |> Option.defaultValue (async.Return None)

Я не думаю, что у него есть какое-либо имя, но вы можете думать о своей функции как Option.map с определенным значением по умолчанию, когда вход недоступен.

...