5

これは本当に奇妙で、私は何か馬鹿げたことをしたのではないかと恐れていますが、それを理解することはできません。

最初のパラメーターとしてNone関数に渡しますが、関数が実行されると、の値はnullになります(nullを出力することは関係ありませんが、関数パラメーターの値はnullではありません)。parentNodeがnullであるため、print関数行でnull参照エラーが発生することになります。引数をタプルして順序を変更しようとしましたが、役に立ちませんでした。これはカリー化と関係があるのではないかとこっそり疑っていますが、途方に暮れています...someparentNodeNoneNone

会社の問題のために実際のURL値を空の文字列に置き換える必要がありましたが、それが役立つ場合はxsdへのURLです

コードは次のとおりです。

#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
4

2 に答える 2

4

残念ながら、それはF#が出力する方法Noneです:

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

タイプのカスタムsprintf関数を簡単に作成できます。次に例を示します。option

let sprintOption v = 
    if Option.isNone v then "None" else sprintf "%A" v
于 2012-05-03T16:04:42.477 に答える
4

Option<'T>Githubのソース[<CompilationRepresentation([CompilationRepresentationFlags.UseNullAsTrueValue)>])は、実行時にnullaryケース(Noneこの場合は)を表す属性を使用しますnull

于 2012-05-03T16:12:47.450 に答える