2016-09-11 6 views
6

(अपडेट किया गया: मैं एक रेप्रो उदाहरण जोड़ लिया है)जिज्ञासु त्रुटियों जब स्पष्ट सदस्य बाधाओं के साथ इनलाइन संयोजन

कोड निम्नलिखित की तरह लग रही है:

type Lib = 
    static member inline tryMe (a: ^a) = 
     let name = (^a: (static member name: string)()) 
     name 

type Test = 
    struct 
     val Value: string 
     new v = {Value = v} 
    end 
    static member inline name with get() = "HiThere" 
    static member works(a:Test) = Lib.tryMe a 

यह "बस काम" और संकलित कर देगा । हालांकि, अगर आप इसे थोड़ा विस्तार, उदाहरण के लिए इस प्रकार की तरह:

/// Does a bounds check and raises an error if bounds check is not met 
let inline checkBounds f (g: 'b -> ^c) (tp: ^a) = 
    let convertFrom = (^a: (static member name: string)()) 
    let convertTo = (^c: (static member name : string)()) 
    let value = (^a: (member Value: 'b) tp) 
    if f value then 
     g value 
    else 
     failwithf "Cannot convert from %s to %s." convertFrom convertTo 


type ConverterA = 
    struct 
     val Value: sbyte 
     new v = { Value = v } 
    end 

    static member inline name with get() = "converter-a" 
    static member inline convert (x: ConverterA) : ConverterB = 
     checkBounds ((>=) 0y) (byte >> ConverterB) x 

and ConverterB = 
    struct 
     val Value: byte 
     new v = { Value = v } 
    end 
    static member inline name with get() = "converter-b" 

यह नकली FSharp संकलक त्रुटियों की एक पूरी गुच्छा बढ़ा देंगे।

त्रुटि FS1114: मान 'Foo.Bar.name' इनलाइन चिह्नित किया गया था लेकिन अनुकूलन वातावरण में बाध्य नहीं था

त्रुटि FS1113: मूल्य 'नाम' इनलाइन चिह्नित किया गया था लेकिन इसकी कार्यान्वयन बनाता है एक आंतरिक या निजी समारोह जो पर्याप्त सुलभ

चेतावनी FS1116 नहीं है के उपयोग: 'इनलाइन' के रूप में चिह्नित एक मूल्य एक अप्रत्याशित मूल्य है

त्रुटि FS1118: टी इनलाइन करने में विफल वह 'नाम' चिह्नित 'इनलाइन' महत्व देते हैं, शायद इसलिए कि एक पुनरावर्ती मूल्य 'इनलाइन'

मैं अन्य इनलाइन कार्यों के साथ हो रहा नहीं देखा है चिह्नित किया गया था। मुझे यकीन नहीं है कि यहां क्या होता है। अगर मैं थोड़ा सा बदलता हूं, उदाहरण के लिए convertTo लाइन और इसकी निर्भरताओं को हटा दें, तो यह ठीक से संकलित करता है।

एफएसआई में कोड चलाते समय त्रुटियां भी दिखाई नहीं देती हैं, यहां तक ​​कि एफएसआई --optimize के साथ स्थापित है।

मैं inline को हटा कर इसके आसपास काम कर सकता हूं। इस तरह के खेतों के लिए इससे कोई फर्क नहीं पड़ता, जेआईटी इनलाइन करेगा, भले ही एफ # नहीं है।

क्या यह एक कंपाइलर बग है? या क्या मेरे कोड में कोई त्रुटि है, या स्पष्ट सदस्य बाधाओं पर कुछ प्रतिबंध मुझे पता नहीं है?

उत्तर

1

आपको फिर से व्यवस्थित करने की आवश्यकता है ताकि आपके द्वारा उपयोग किए जाने वाले कार्यों को उस बिंदु पर जाना जाता है जहां आप उनका उपयोग करते हैं, अन्यथा ऐसा लगता है कि एफ # कंपाइलर को इनलाइन में क्या पता नहीं है। जैसा कि आपने इस जवाब के नीचे टिप्पणियों में कहा है कि यदि आप मुझसे पूछें तो यह एक बग है।

/// Does a bounds check and raises an error if bounds check is not met 
let inline checkBounds f (g: 'b -> ^c) (tp: ^a) = 
    let convertFrom = (^a: (static member name: string)()) 
    let convertTo = (^c: (static member name : string)()) 
    let value = (^a: (member Value: 'b) tp) 
    if f value then 
     g value 
    else 
     failwithf "Cannot convert from %s to %s." convertFrom convertTo 

type ConverterB = 
    struct 
     val Value: byte 
     new v = { Value = v } 
    end 
    static member inline name with get() = "converter-b" 

and ConverterA = 
    struct 
     val Value: sbyte 
     new v = { Value = v } 
    end 

    static member inline name with get() = "converter-a" 
    static member inline convert (x: ConverterA) : ConverterB = 
     checkBounds ((>=) 0y) (byte >> ConverterB) x 
+1

के रूप में वास्तव में अन्य प्रश्न के साथ, यह एक समाधान के रूप हल करती है, लेकिन तथ्य यह है कि यह है (शायद) एफ # में एक बग के रूप में आदेश यहाँ अप्रासंगिक माना जाता है को दूर नहीं करता: [मेरी बग रिपोर्ट से कल] (https://github.com/Microsoft/visualfsharp/issues/1565)। – Abel

+0

यह सच है, रिपोर्टिंग के लिए धन्यवाद। जैसा कि मैंने दूसरी टिप्पणी में कहा था, मुझे लगता है कि संकलक को पता नहीं है कि उस बिंदु पर इनलाइन क्यों करना है जहां वह इनलाइन करने की कोशिश करता है। – CodeMonkey

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