我想在F#中创建一个bitflags枚举,使用bitshift运算符来提高可读性:例如
[<Flags>]
type DaysOfWeek =
| Monday = 1 <<< 0
| Tuesday = 1 <<< 1
| Wednesday = 1 <<< 2
| Thursday = 1 <<< 3
| Friday = 1 <<< 4
| Saturday = 1 <<< 5
| Sunday = 1 <<< 6
Run Code Online (Sandbox Code Playgroud)
但是,F#编译器不喜欢这个.它说"成员定义中的意外中缀运算符".
我希望这种方法超过两种手动权限.有没有办法说服编译器我不是邪恶的?
mar*_*lam 10
这不完全是你要求的,但你可以使用0b前缀来编写二进制长手,例如:
[<Flags>]
type DaysOfWeek =
| Monday = 0b0000001
| Tuesday = 0b0000010
| Wednesday = 0b0000100
| Thursday = 0b0001000
| Friday = 0b0010000
| Saturday = 0b0100000
| Sunday = 0b1000000
Run Code Online (Sandbox Code Playgroud)
将案例与值分开的替代方法,更冗长但更灵活:
type DaysOfWeek =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
with
static member Flag x =
let bit n = 1 <<< n
match x with
| Monday -> bit 0
| Tuesday -> bit 1
| Wednesday -> bit 2
| Thursday -> bit 3
| Friday -> bit 4
| Saturday -> bit 5
| Sunday -> bit 6
Run Code Online (Sandbox Code Playgroud)
这是 Dave Fancher 在The Book of F#中推荐的方法
使用值为 2 的幂的 Flags 属性:
open System
[<Flags>]
type DayOfWeek =
| None = 0
| Sunday = 1
| Monday = 2
| Tuesday = 4
| Wednesday = 8
| Thursday = 16
| Friday = 32
| Saturday = 64
Run Code Online (Sandbox Code Playgroud)
Flags 属性不是必需的,但可以明确您的意图。
您现在可以使用按位运算符表示值的组合:
let weekend = DayOfWeek.Saturday ||| DayOfWeek.Sunday
Run Code Online (Sandbox Code Playgroud)