【问题标题】:How to create a array of record values如何创建记录值数组
【发布时间】:2021-11-01 19:28:43
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您必须与类型系统作斗争(否则您只需明确地重构记录和总和字段的值),那么现在是重新考虑类型设计(甚至是语言选择 :))的时候了.如果(至少有时)您只需要一个概率列表,您真的需要记录吗?
  • (显然是“解构”,而不是“重组”——发现为时已晚,无法修复)
  • 我确实在重新考虑我的类型选择,但我想知道这是否可能:) - 记录之所以诱人,是因为我可以标记我的概率并且我很少需要列表,但是在验证时它会使代码更加简洁。更糟糕的是,我可以单独访问它们。
  • 您可以为Probabilities 类型定义一个静态成员(例如,AsList,它将返回一个概率列表)——不确定这是否比显式解构更好,但可能不那么冗长。想到的另一件事是反射(github.com/dotnet/fsharp/blob/main/src/fsharp/FSharp.Core/…),但看起来很肮脏,应该尽可能避免......
  • 您能否像@KonstantinStrukov 建议的那样详细说明您希望避免解构的原因?

标签: functional-programming f#


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以向 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多