.net F#将none传递给函数,将null作为参数值
这真的很奇怪,我担心我刚刚做了一些愚蠢的事情,但我无法理解 我将.net F#将none传递给函数,将null作为参数值,.net,f#,.net,F#,这真的很奇怪,我担心我刚刚做了一些愚蠢的事情,但我无法理解 我将None作为第一个参数传递给函数some,但是当函数执行时,parentNode的值为null(我不关心它为None打印null,函数参数值为null而不是None)。由于parentNode为null,我在print函数行上得到一个null引用错误。我尝试对参数进行二元组化并更改顺序,但没有起到任何作用。我暗自怀疑这与咖喱有关,但我不知所措 对于公司问题,我不得不用一个空字符串替换真实的url值,但如果有帮助的话,它是指向xsd的
None
作为第一个参数传递给函数some
,但是当函数执行时,parentNode
的值为null(我不关心它为None
打印null,函数参数值为null而不是None
)。由于parentNode为null,我在print函数行上得到一个null引用错误。我尝试对参数进行二元组化并更改顺序,但没有起到任何作用。我暗自怀疑这与咖喱有关,但我不知所措
对于公司问题,我不得不用一个空字符串替换真实的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
#灯
开放系统
开放系统.Xml
开放系统.Net
open System.Collections.Generic
类型StartResult=
|XsdParserParameters的参数
|Xsd的Xsd
和Xsd(文本)=
让行=新列表()
请各位议员发言
使用get()=文本
请记住这一行
使用get()=行
和XsdParserParameters()=
让可变url=“”
请输入此.Url
使用get()=url
和设置(值)=url
StartResult.参数(此)
let处理器()=
let parameters=XsdParserParameters()
参数Url
//一些错误
()
|StartResult.Xsd(Xsd)->
让我们记录一些(parentNode:XmlNode选项)(节点:XmlNode)=
设a=()
对于node.ChildNodes中的子节点
将subNode.LocalName与匹配
|“complexType”->
xsd.Rows.Add(
把格式数据写成串
%O~%s~%d~%d~%s~%s~%O
父节点
子节点值
1.
1.
(subNode.Attributes.GetNamedItem(“名称”).Value)
""
(错误)
一些(一些(子节点))子节点
|“顺序”->
某些父节点子节点
|“要素”->
xsd.Rows.Add(
斯普林特
%O~%s~%d~%d~%s~%s~%O
父节点
子节点值
1.
1.
(subNode.Attributes.GetNamedItem(“名称”).Value)
""
(错误)
一些(一些(子节点))子节点
| _ ->
()
设xdoc=newxmldocument();
xdoc.LoadXml(xsd.Text)
部分(无)(xdoc.DocumentElement)
处理器()
printfn“完成…”
Console.ReadLine()|>忽略
不幸的是,F#打印出无
:
> sprintf "%O" None;;
val it : string = "<null>"
option这很好,是意料之中的事。问题是第一个参数没有得到“none”,而是得到null。我更新了我的问题以澄清为什么这样做:>printfn“%O”无?该错误是否也应该使用空引用来解决?那么匹配语句呢?我可以匹配None、null或两者吗?@Brad:因为printf
在尝试调用ToString()
之前会检查null并打印“”。这同样有效:printfn“%O”null
@Brad:Yes,您可以在None
/null
上进行匹配。请尝试:Some(1)。Value
和(None:int选项)。Value
和()。ToString()
在哪一行上出现空引用异常sprintf“%O”null
应该可以正常工作,而且我没有看到任何其他对parentNode
的引用,您确定这就是错误的来源吗?
let sprintOption v =
if Option.isNone v then "None" else sprintf "%A" v