Как сгладить список вариантов - PullRequest
1 голос
/ 15 апреля 2019

У меня есть этот фрагмент кода:

 results
 |> List.filter(Belt.Option.isSome)
 |> List.map(item =>
      switch (item) {
      | Some(item) => item
      }
    )

Кто-нибудь может сделать его короче?Это фильтр, который удаляет недействительные значения, за которыми следует карта, которая преобразует / разворачивает необязательные значения в просто значения.

В Scala это будет просто flatten:

scala> List(Some("test"),None,None,Some("foo"),Some("bar"),None).flatten
res4: List[String] = List(test, foo, bar)

1 Ответ

2 голосов
/ 15 апреля 2019

flatten в Scala, похоже, работает с любой монадой.И этот тип полиморфизма, называемый специальным полиморфизмом, к сожалению, не поддерживается в OCaml (хотя он включен в план, как функция, называемая «модульные имплициты»).Поэтому мы должны написать код, специфичный для list с option с.Используя всего лишь Belt, мы можем сделать это:

[Some("test"), None, None, Some("foo"), Some("bar"), None]
|> Belt.List.keepMap(_, x => x)

keepMap - это то, что в стандартных библиотеках называется filterMap, и принимает функцию, которая должна возвращать option вместо bool, где None будет отфильтрован, а Some(x) будет сплющен и включен в окончательный список как просто x.

...