在 F# 中从 union 中随机选择一个实例

发布于 2024-08-13 09:20:43 字数 88 浏览 4 评论 0原文

在 F# 中,给定

type MyType = A |乙| C | d |电子| F | G

如何随机定义 MyType 的实例?

In F#, given

type MyType = A | B | C | D | E | F | G

How do I randomly define an instance of MyType?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

百思不得你姐 2024-08-20 09:20:43

这应该可行:

let randInst<'t>() = 
  let cases = Reflection.FSharpType.GetUnionCases(typeof<'t>)
  let index = System.Random().Next(cases.Length)
  let case = cases.[index]
  Reflection.FSharpValue.MakeUnion(case, [||]) :?> 't

此代码假设联合案例都是无效的,并且您使用的类型实际上是联合类型,但是很容易显式检查这些假设并在需要时抛出有意义的异常。

This ought to work:

let randInst<'t>() = 
  let cases = Reflection.FSharpType.GetUnionCases(typeof<'t>)
  let index = System.Random().Next(cases.Length)
  let case = cases.[index]
  Reflection.FSharpValue.MakeUnion(case, [||]) :?> 't

This code assumes that the union cases are all nullary and that the type you're using is actually a union type, but it would be easy to explicitly check those assumptions and throw meaningful exceptions if desired.

无法言说的痛 2024-08-20 09:20:43

选择一个随机数,然后将该数字与返回不同时刻的不同分支进行模式匹配?

Select a random number, then pattern match that number with different branches returning a different instant?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文