F#XML类型提供程序和可选类型

时间:2014-04-02 12:21:29

标签: xml f# type-providers f#-data

在这两个功能相同的XML文件上使用XML类型提供程序会为XML类型提供程序提供不同的结果。

XML文件1:

<?xml version="1.0" encoding="utf-8"?>
<params>
  <mode >
     <reg >0</reg>     
  </mode>
  <mode >
     <reg >1.7976931348623157E+308</reg>     
  </mode>
  <mode></mode>
</params>

XML文件2:

<?xml version="1.0" encoding="utf-8"?>
<params>
  <mode>    
  </mode>
  <mode >
    <reg >0</reg>
  </mode>
  <mode >
    <reg >1.7976931348623157E+308</reg>
  </mode>
</params>

请注意,唯一的区别是空“模式”位于一个文件的末尾,而另一个文件的开头位于另一个文件的末尾。

测试F#代码如下所示:

type  Test = XmlProvider<""".\test.xml""">
type  Test2 = XmlProvider<""".\test2.xml""">

let xml = Test.GetSample()
let list1 = [for mode in xml.Modes -> mode.Reg]

let xml2 = Test2.GetSample()
let list2 = [for mode in xml2.Modes -> mode.Reg]

list1的类型为“Option&lt; float&gt; list”,正如您所期望的那样。但是list2的类型为“float list”,这是不正确的并导致运行时异常。

为什么会发生这种情况?如何避免此问题?

2 个答案:

答案 0 :(得分:3)

您使用的是哪种版本的F#数据?你试过最新的2.x吗?如果仍然无效,请在https://github.com/fsharp/FSharp.Data/issues

上提交问题

答案 1 :(得分:1)

这已在最新的F#数据版本中修复