我想在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)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           753 次  |  
        
|   最近记录:  |