歧视与文字结合

时间:2012-11-03 01:41:03

标签: types f# literals

对于位类型,F#中的正确语法是什么,只有两个可能的值:0和1。 我试过了;

type bit = 
         | 0
         | 1

,错误消息为error FS0010: Unexpected integer literal in union case。 我需要使用[<Literal>]吗?

我收到了不同的错误消息:error FS0010: Unexpected integer literal in union case. Expected identifier, '(', '(*)' or other token.

2 个答案:

答案 0 :(得分:6)

如果您正在寻找Bit的类型安全表示形式,您可能更喜欢将DUs用于枚举模式匹配的枚举:

type Bit = Zero | One
with member x.Value =
     match x with
     | Zero -> 0
     | One -> 1

如果您想要一个简洁的表示法,boolean类型是一个很好的候选人:

let [<Literal>] Zero = false
let [<Literal>] One = true

let check = function
    | Zero -> "It's Zero"
    | One -> "It's One"

当有Bit个集合时,您可以查看BitArray以获得更有效的治疗。他们确实使用boolean作为内部表示。

答案 1 :(得分:4)

您想使用枚举 -

type bit = 
     | Zero= 0
     | One = 1

虽然模式匹配不如受歧视的联盟好。

或者你也可以使用DU和

type bit =
|Zero
|One
member x.Int() =
    match x with
    |Zero -> 0
    |One -> 1