2010-10-08 130 views
16

閱讀Chris的答案F# - public literal,並在http://blogs.msdn.com/b/chrsmith/archive/2008/10/03/f-zen-the-literal-attribute.aspx博客文章之後,我不知道爲什麼下面不工作:文字屬性不工作

[<Literal>] 
let one = 1 

[<Literal>] 
let two = 2 

let trymatch x = 
    match x with 
    | one -> printfn "%A" one 
    | two -> printfn "%A" two 
    | _ -> printfn "none" 


trymatch 3 

這樣可以使印刷‘3’,雖然我覺得它不應該。我在這裏看不到什麼?

回答

21

我認爲文字需要大寫。以下工作正常:

[<Literal>] 
let One = 1 
[<Literal>] 
let Two = 2 

let trymatch x = 
    match x with 
    | One -> printfn "%A" One 
    | Two -> printfn "%A" Two 
    | _ -> printfn "none" 


trymatch 3 

另外,如果你想爲這一個很好的通用解決方案,而無需使用文字,你可以定義參數化的主動模式是這樣的:

let (|Equals|_|) expected actual = 
    if actual = expected then Some() else None 

然後就是寫

let one = 1 
let two = 2 

let trymatch x = 
    match x with 
    | Equals one -> printfn "%A" one 
    | Equals two -> printfn "%A" two 
    | _ -> printfn "none" 
+2

是的,確認。編譯器警告我關於各種明顯的東西,但是當你真的需要它時... – 2010-10-08 11:43:09

2

不要問我爲什麼,但它的工作原理,當你寫你的文字大寫:

[<Literal>] 
let One = 1 
[<Literal>] 
let Two = 2 

let trymatch (x:int) = 
    match x with 
    | One -> printfn "%A" One 
    | Two -> printfn "%A" Two 
    | _ -> printfn "none" 

trymatch 3 
7

此外,如果你不希望有大寫文字,你可以把它們放在一個模塊(這裏命名常數)中:

module Const = 
    [<Literal>] 
    let one = 1 
    [<Literal>] 
    let two = 2 

let trymatch x = 
    match x with 
    | Const.one -> printfn "%A" Const.one 
    | Const.two -> printfn "%A" Const.two 
    | _ -> printfn "none" 

trymatch 3 
+2

任何想法,如果有這種行爲背後的理由? – 2010-10-08 11:45:49

+0

@亞歷山大:我不知道。請注意,模塊名稱不需要大寫。 – Stringer 2010-10-08 11:49:27

+1

@Alexander - 該行爲也在規範中。據推測,如果它是一個包含「。」的複合標識符,那麼它肯定不是一個變量,所以你繼續進行名稱解析。 – kvb 2010-10-08 11:53:14

13

其他的答案是正確的 - 你必須以大寫字母開頭的標識符。見7.1.2 of the spec(命名的模式),其中指出:

如果長IDENT是不以大寫字符然後它總是被解釋爲一個可變結合圖案開始的單個標識符和表示一個變量受該模式約束

+0

我很佩服你對規範的百科知識,試圖到達那裏,但仍然有幾個月的時間,因爲它似乎......只是想知道:在這種情況下,將整個機制基於案例第一個字母,即大寫=匹配,小寫=綁定;共享屬性與標識符案例之間的責任似乎使得它比必要的更加複雜。 – 2010-10-08 11:53:01

+0

+1以供參考適當的規格部分。 – Frank 2010-10-08 12:03:59

+1

@Alexander - 我同意這種行爲令人困惑 - 我不知道爲什麼團隊選擇了他們所做的方法。它也好像給了目前的行爲,對小寫字面量的一些額外的編譯器警告或使用影子字面值的變量名稱的匹配將被保證。 – kvb 2010-10-08 12:49:51