【发布时间】: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 建议的那样详细说明您希望避免解构的原因?