2012-05-03 9 views
5

के रूप में शून्य हो रहा है यह वास्तव में अजीब है और मुझे डर है कि मैंने अभी कुछ गूंगा किया है लेकिन मैं इसे समझ नहीं सकता।एफ # कार्य करने के लिए कोई भी गुजर रहा है, पैरामीटर मान

मैं पहले पैरामीटर के रूप समारोह some करने के लिए None गुजर रहा हूँ, लेकिन जब फ़ंक्शन निष्पादित, parentNode का मूल्य शून्य है (मैं इसे None के लिए अशक्त मुद्रण के साथ संबंध नहीं कर रहा हूँ, समारोह पैरामीटर मान नहीं रिक्त है None)। मैं प्रिंट फ़ंक्शन लाइन पर एक शून्य संदर्भ त्रुटि प्राप्त कर रहा हूं क्योंकि parentNode शून्य है। मैंने तर्कों को टुपल करने और ऑर्डर बदलने की कोशिश की है, लेकिन इससे मदद नहीं मिली। मुझे एक झुकाव संदेह है कि इसमें करी के साथ कुछ करना है लेकिन मुझे नुकसान हुआ है ...

मुझे कंपनी के मुद्दों के लिए एक खाली स्ट्रिंग के साथ वास्तविक यूआरएल मूल्य को प्रतिस्थापित करना था, लेकिन यह एक xsd का यूआरएल है कि अगर

में मदद करता है यहाँ कोड है:

#light 
open System 
open System.Xml 
open System.Net 
open System.Collections.Generic 

type StartResult = 
    | Parameters of XsdParserParameters 
    | Xsd of Xsd 

and Xsd(text) = 
    let rows = new List<string>() 

    member this.Text 
     with get() = text 

    member this.Rows 
     with get() = rows 

and XsdParserParameters() = 
    let mutable url = "" 

    member this.Url 
     with get() = url 
     and set(value) = url <- value 

    member this.Start() = 
     try 
      use client = new WebClient() 
      let xsd = client.DownloadString(this.Url) 
      StartResult.Xsd(Xsd(xsd)) 
     with e -> 
      StartResult.Parameters(this) 

let processor() = 
    let parameters = XsdParserParameters() 
    parameters.Url <- "" 
    match parameters.Start() with 
    | StartResult.Parameters(xpparams) -> 
     //some error 
     () 
    | StartResult.Xsd(xsd) -> 

     let rec some (parentNode : XmlNode option) (node : XmlNode) = 
      let a =() 

      for subNode in node.ChildNodes do 
       match subNode.LocalName with 
       | "complexType" -> 
        xsd.Rows.Add(
         sprintf 
          "%O~%s~%d~%d~%s~%s~%O" 
          parentNode 
          subNode.Value 
          1 
          1 
          (subNode.Attributes.GetNamedItem("name").Value) 
          "" 
          false) 
        some (Some(subNode)) subNode 
       | "sequence" -> 
        some parentNode subNode 
       | "element" -> 
        xsd.Rows.Add(
         sprintf 
          "%O~%s~%d~%d~%s~%s~%O" 
          parentNode 
          subNode.Value 
          1 
          1 
          (subNode.Attributes.GetNamedItem("name").Value) 
          "" 
          false) 
        some (Some(subNode)) subNode 
       | _ -> 
        () 

     let xdoc = new XmlDocument(); 
     xdoc.LoadXml(xsd.Text) 

     some (None) (xdoc.DocumentElement) 

processor() 

printfn "Done..." 
Console.ReadLine() |> ignore 
+0

आपको किस पंक्ति पर शून्य संदर्भ अपवाद मिल रहा है? 'sprintf"% O "null' को ठीक काम करना चाहिए, और मुझे 'parentNode' के किसी अन्य संदर्भ को नहीं दिख रहा है, क्या आप वाकई यह कहां से आ रहे हैं? – Guvante

उत्तर

4

दुर्भाग्य से, यह रास्ता एफ # प्रिंट बाहर None है:

> sprintf "%O" None;; 
val it : string = "<null>" 

आप आसानी से एक कस्टम लिख सकते हैं +०१२३४१९५१२३७ option प्रकार के लिए १०४०३३३२१० समारोह, उदाहरण के लिए:

let sprintOption v = 
    if Option.isNone v then "None" else sprintf "%A" v 
+0

यह ठीक है और उम्मीद है। समस्या यह है कि पहला पैरामीटर "कोई नहीं" नहीं मिलता है, यह शून्य हो जाता है। मैंने – Brad

4

Option<'T> (source on Github) विशेषता [<CompilationRepresentation([CompilationRepresentationFlags.UseNullAsTrueValue)>] जो (, None इस उदाहरण में) nullary मामले का कारण बनता है रन-टाइम में null द्वारा प्रतिनिधित्व किए जाने का उपयोग करता है।

+0

को स्पष्ट करने के लिए अपना प्रश्न अपडेट किया है यह क्यों काम करता है:> printfn "% O" कोई नहीं ;; ? क्या यह एक शून्य संदर्भ के साथ भी त्रुटि होनी चाहिए? और मैच बयान के बारे में क्या? क्या मैं किसी भी, शून्य या दोनों से मेल नहीं कर सकता? – Brad

+1

@ ब्रैड: क्योंकि 'toString()' को कॉल करने का प्रयास करने से पहले 'printf' शून्य और प्रिंट के लिए चेक करता है ""। यह भी काम करता है: 'printfn "% O" null'। – Daniel

+0

@ ब्रैड: हाँ, आप 'कोई नहीं'/'शून्य 'पर मेल खा सकते हैं। – Daniel

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