如何枚举F#中的枚举/类型

时间:2010-02-02 04:48:10

标签: .net f# enums

我有一个如此定义的枚举类型:

type tags = 
    | ART  = 0
    | N    = 1
    | V    = 2 
    | P    = 3
    | NULL = 4

有没有办法for ... in tags do

这是我得到的错误:

  

值,构造函数,命名空间或   类型tags未定义

7 个答案:

答案 0 :(得分:8)

使用Enum.GetValues

let allTags = Enum.GetValues(typeof<tags>)

答案 1 :(得分:6)

这是一个完整的示例,用于打印有关任何区别联合的信息。它显示了如何获得歧视联合的案例以及如何获取字段(如果您需要它们)。该函数打印给定的区分联合的类型声明:

open System
open Microsoft.FSharp.Reflection

let printUnionInfo (typ:Type) = 
  printfn "type %s =" typ.Name
  // For all discriminated union cases
  for case in FSharpType.GetUnionCases(typ) do
    printf "  | %s" case.Name
    let flds = case.GetFields()
    // If there are any fields, print field infos
    if flds.Length > 0 then 
      // Concatenate names of types of the fields
      let args = String.concat " * " [ for fld in flds -> fld.PropertyType.Name ] 
      printf " of %s" args
    printfn ""    

// Example
printUnionInfo(typeof<option<int>>)

答案 2 :(得分:3)

您可以使用Enum.GetValues,它会返回Array个对象,然后您必须向下转换为整数值。 (注意:我使用的是Mono的F#实现;也许与.NET有所不同。)

以下是我编写的一些函数,用于获取所有枚举值的列表并获取最小值和最大值:

open System

module EnumUtil =

    /// Return all values for an enumeration type
    let EnumValues (enumType : Type) : int list =
        let values = Enum.GetValues enumType
        let lb = values.GetLowerBound 0
        let ub = values.GetUpperBound 0
        [lb .. ub] |> List.map (fun i -> values.GetValue i :?> int) 

    /// Return minimum and maximum values for an enumeration type
    let EnumValueRange (enumType : Type) : int * int =
        let values = EnumValues enumType
        (List.min values), (List.max values)

答案 3 :(得分:3)

怎么样:

chars = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
chars_dict = {ord(c): c for c in chars}
return chars_dict.get(code, 'wat')

这具有提供强类型列表

的优点

仅使用:

let enumToList<'a> = (Enum.GetValues(typeof<'a>) :?> ('a [])) |> Array.toList

答案 4 :(得分:2)

要使它成为枚举,您需要为每个案例显式赋值,否则它是一个联合类型:

type tags = 
    | ART = 0
    | N = 1
    | V = 2
    | P = 3
    | NULL= 4
let allTags = System.Enum.GetValues(typeof<tags>)

答案 5 :(得分:2)

罗伯特关于如何生成实际枚举并获取其案例的权利。如果您有真正的联合类型,则可以通过Microsoft.FSharp.Reflection.FSharpType.GetUnionCases函数获取案例。

答案 6 :(得分:0)

type Options = 
    | Exit          = 0
    | CreateAccount = 1

Console.WriteLine()
Console.WriteLine("Choose an option:")
let allOptions = Enum.GetValues(typeof<Options>)
for option in allOptions do
    if (option <> null) then
        Console.WriteLine(sprintf "%d: %s" (option :?> int) (option.ToString()))
let optionChosen = System.Console.ReadLine()