gpt4 book ai didi

reflection - 映射可区分联合中的所有值

转载 作者:行者123 更新时间:2023-12-02 22:40:19 25 4
gpt4 key购买 nike

假设我有一个受歧视的工会:

type card = Smithy | Cellar | Chapel

还有一个函数将被区分的联合映射到某个值:

let initialCardCount = function
Smithy -> 4
Cellar -> 6
Chapel -> 2

我想生成一个 map ,其中包含每个工会成员的成本,例如:

[(Smithy, 4); (Cellar, 6); (Chapel, 2)]

这可能吗?我希望能够做类似的事情:

List.zip (allValues f) (List.map getCost (allValues f)) |> Map.ofList

This question很有帮助,但不是我所需要的;我希望能够访问内存中的联合成员,而不仅仅是检查它们的属性。

我想这样做的原因是我可以有一个代表游戏中所有不同类型纸牌的可区分联合,以及一个函数来告诉你每张纸牌在开始时应该有多少,然后很容易生成卡片到计数的初始映射。有更好的方法吗?

最佳答案

您可以使用 F# 反射获得所有可能的可区分联合案例的列表,但了解反射的缺点很重要 - 除非小心使用,否则很容易导致糟糕的设计(可能有更简单和更优雅的功能解决方案),而且效率也较低(尽管您可能只需要获取所有案例的列表一次)。

以下 getAllValues 函数获取所有情况 - 它假设没有任何情况存储任何值(即 Smithy of string 将不起作用!)如果你想通过案例的一些参数,您需要在 MakeUnion 的第二个参数中传递装箱值:

open Microsoft.FSharp.Reflection

let getAllValues<'T>() : 'T list =
let cases = FSharpType.GetUnionCases(typeof<'T>)
[ for c in cases -> unbox (FSharpValue.MakeUnion(c, [| |])) ]

这是在您的场景中使用该函数的示例:

type card = Smithy | Cellar | Chapel 

let initialCardCount = function
| Smithy -> 4
| Cellar -> 6
| Chapel -> 2

let values = getAllValues<card>()
List.zip values (List.map initialCardCount values)

关于reflection - 映射可区分联合中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10867544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com