F # | Array.map и Array.filter за один шаг (одна функция) - PullRequest
1 голос
/ 20 июня 2020

Имеем этот пример:

open FSharp.Data

let jsonStirng = @"[ 
    {""red"": 100, ""green"": 100, ""blue"": 100, ""alpha"": 1.0 },
    {""red"": 100, ""green"": 100, ""blue"": 100, ""alpha"": 0.5 },
    ]"

let getSolidColors jsonString =
    let getColor item = 
        if (item:JsonValue).["alpha"].AsDecimal() < 1m
        then Some( {R=item.["red"].AsInteger(); G=item.["green"].AsInteger(); B=item.["blue"].AsInteger()} )
        else None

    JsonValue.Parse(jsonString).AsArray() 
    |> Array.map getColor 
    |> Array.filter (fun x -> x.IsSome)
    |> Array.map (fun x -> x.Value)

Возможно ли иметь единственную функцию, которая выполняет отображение и фильтрацию за один вызов? Типа Array.mapfilter (это не сокращение , потому что у меня нет аккумулятора, или, может быть, это решение?!)

Или есть альтернативная реализация (кроме для l oop), чтобы избежать использования промежуточных Option и 3 вызовов функций массива?

1 Ответ

6 голосов
/ 20 июня 2020

Конечно, вы можете:

JsonValue.Parse(jsonString).AsArray() 
|> Array.choose getColor 
...