如何创建记录值数组

How to create a array of record values

我有一个问题,我有一个只包含特定类型的记录(在我的例子中称为概率),我想用记录值创建数组。

type Probability = Probability of float 

type Probabilities = {
    Pp: Probability;
    Pf: Probability;
    Pd: Probability;
    Pg: Probability; 
 }
let calculatingSum (probablities : Probabilities) =
   probablities
   // I need something, that can transform probablities to an array of Probability
   // such that I can do something like
   [|1.0;0.5|]
   |> Array.sum

我知道可以单独访问所有元素,但我真的想避免这种情况。

如果我有理由将数据同时视为记录和集合,我会转换为地图(并在需要时将其转换为数组或列表) 像这样:

module Probabilities =
    let asMap (p : Probabilities) = 
        Map.ofList [
            "Pp", p.Pp
            "Pf", p.Pf
            "Pd", p.Pd
            "Pg", p.Pg
        ]

您可以向 Probabilities 类型添加一个方法,将其内容转换为数组:

type Probabilities = {
    Pp: Probability;
    Pf: Probability;
    Pd: Probability;
    Pg: Probability; 
 }
with
    member this.ToArray =
        [|
            this.Pp
            this.Pf
            this.Pd
            this.Pg
        |]

然后像这样使用它:

let calculatingSum (probablities : Probabilities) =
   probablities.ToArray
        |> Array.sumBy (fun (Probability p) -> p)
        |> Probability