F# | Array.map & Array.filter 一步到位(单功能)

Ale*_* 75 1 f#

有这个例子:

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)
Run Code Online (Sandbox Code Playgroud)

是否可以有一个函数在一次调用中生成地图和过滤器功能?
有点Array.mapfilter(不是因为我没有累加器而减少,或者这可能是解决方案?!)

或者,有一个替代实现(除了for循环)来避免使用中间Option和 3 Array 函数调用?

Koe*_*ear 6

当然,你可以这样做:

JsonValue.Parse(jsonString).AsArray() 
|> Array.choose getColor 
Run Code Online (Sandbox Code Playgroud)