F#の解説記事やドキュメント等の作成においてAzure Notebooksは活躍しまくりなんじゃないか説を検証するために、簡単なノートを作成してみようと思います。今回のテーマは列挙体です。F#における列挙体は判別共用体の陰に隠れてしまいがちですが、実務などでF#を使用する際にはどうしても必要になってきます。
// 列挙体の定義
type MyEnum =
| One = 1
| Two = 2
| Three = 3
MyEnum.One
enum<MyEnum> 2
enum<MyEnum> 4
MyEnum() // コンストラクタ
int
関数を利用することで、数値として扱うことができます。
let next : MyEnum -> MyEnum = int >> ( + ) 1 >> enum
next MyEnum.One
next MyEnum.Three
[<System.Flags>]
type MyBitFlags =
| A = 0b0001
| B = 0b0010
| C = 0b0100
| D = 0b1000
MyBitFlags.A ||| MyBitFlags.C
結果の表示が親切です。
enum<MyBitFlags> 6
enum<MyBitFlags> 0b1001
let x = MyBitFlags.A ||| MyBitFlags.B
x &&& MyBitFlags.A
x &&& MyBitFlags.C
サフィックスを付けて優しく定義するだけです。(uyはbyte型のサフィックス)
type ByteEnum =
| One = 1uy
| Two = 2uy
| Three = 3uy
ByteEnum.One
byte ByteEnum.Two
int ByteEnum.Three
byte型の列挙体を定義するのは非常に簡単でしたが、少し困ることもあります。 enum関数を使用することができなくなります。
enum<ByteEnum> 1uy
そんな時にご紹介したいのが、こちらの商品です。
LanguagePrimitives.EnumOfValue<byte, ByteEnum> 1uy
今ならなんと、LanguagePrimitives.EnumToValue<'Enum,'T>
関数もお付けします! (あまり使わない)