2010-10-08 18 views
16

गुण F# - public literal को क्रिस 'जवाब और http://blogs.msdn.com/b/chrsmith/archive/2008/10/03/f-zen-the-literal-attribute.aspx पर ब्लॉग पोस्ट को पढ़ने के बाद मैं क्यों निम्नलिखित काम नहीं कर रहा नहीं मिलता है नहीं करना चाहिए। यह क्या है कि मैं यहाँ नहीं देखता?शाब्दिक काम नहीं कर रहा

उत्तर

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

हां, पुष्टि की गई है। कंपाइलर मुझे सभी प्रकार के स्पष्ट सामानों के बारे में चेतावनी देता है, लेकिन जब आपको वास्तव में इसकी आवश्यकता होती है ... –

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

कोई विचार अगर उस व्यवहार के पीछे कोई तर्क है? –

+0

@Alexander: मुझे नहीं पता। ध्यान दें कि यहां मॉड्यूल का नाम ऊपरी कैस्ड होने की आवश्यकता नहीं है .. – Stringer

+1

@Alexander - वह व्यवहार भी spec में है। संभावित रूप से तर्क यह है कि यदि यह एक कंपाउंड पहचानकर्ता है जिसमें '.' है तो यह निश्चित रूप से एक चर नहीं है, इसलिए आप नाम समाधान के साथ आगे बढ़ते हैं। – kvb

13

अन्य उत्तर सही कर रहे हैं - आप एक अपरकेस अक्षर के साथ अपने पहचानकर्ता शुरू करनी चाहिए । अनुभाग 7.1.2 of the spec (नाम पैटर्न), जिसमें कहा गया है देखें कि:

तो लंबे समय से अध्यक्ष के लिए एक एकल पहचानकर्ता कि एक अपरकेस चरित्र तो यह हमेशा एक चर बाध्यकारी पैटर्न के रूप में व्याख्या की है से शुरू नहीं होता है और एक चर का प्रतिनिधित्व करता है कि पैटर्न

+0

मैं कल्पना के अपने विश्वकोश ज्ञान की प्रशंसा करता हूं, वहां पहुंचने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि कुछ महीने पहले ... बस सोच रहा है: इस मामले में, मामले में पूरी तंत्र का आधार बनाने के लिए यह अधिक सरल नहीं होगा पहले अक्षर, यानी अपरकेस = मिलान, लोअरकेस = बाध्यकारी; विशेषता और पहचानकर्ता मामले के बीच जिम्मेदारी साझा करना आवश्यक से अधिक जटिल बना देता है। Spec के उचित खंड के संदर्भ के लिए –

+0

+1। – Frank

+1

@Alexander - मैं मानता हूं कि यह व्यवहार उलझन में है - मुझे नहीं पता कि टीम ने दृष्टिकोण क्यों चुना है। ऐसा लगता है कि वर्तमान व्यवहार दिया गया है, लोअरकेस अक्षरों पर कुछ अतिरिक्त कंपाइलर चेतावनियां या वेरिएबल नामों का उपयोग करके मिलान करते हैं जो छाया शब्दशः की आवश्यकता होगी। – kvb

संबंधित मुद्दे