Случайно выбрать экземпляр из объединения в F # - PullRequest
5 голосов
/ 06 декабря 2009

В F # дано

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

Как случайным образом определить экземпляр MyType?

Ответы [ 2 ]

9 голосов
/ 06 декабря 2009

Это должно сработать:

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

В этом коде предполагается, что все случаи объединения являются нулевыми и что тип, который вы используете, на самом деле является типом объединения, но было бы легко явно проверить эти предположения и выдать значимые исключения, если это необходимо.

5 голосов
/ 06 декабря 2009

Выберите случайное число, а затем шаблон сопоставить это число с различными ветвями, возвращая другой момент?

...