【问题标题】:Weird None behaviour in type providers类型提供程序中的奇怪无行为
【发布时间】:2013-07-07 20:13:55
【问题描述】:

有一个类型提供程序,分别具有“string”、“string option”和“int option”类型的三个属性“a”、“b”和“c”。

当我在这些属性中有一个带有“”、None 和 Some 1 的实例时,这会失败:

(row1.a, row1.b, row1.c) |> should equal ("", None, Some 1)

但所有这些都可以正常工作:

row1.a |> should equal ""

row1.b |> should equal None

row1.c |> should equal (Some 1)

("", None, Some 1) |> should equal ("", None, Some 1)

这怎么可能?什么可以使 b 中的 None 与任何其他 None 不同?编译后None只是一个null,.Net中两个null值可以不一样吗?

元组与大多数 F# 类型一样具有结构相等性,因此它应该可以工作。 我收到带有消息的 NUnit.Framework.AssertionException:

Expected: <(, , Some(1))>
But was:  <(, , Some(1))>

NUnit 只是调用 .Equals,所以这就是问题所在。

这也失败了:

(row1.a, row1.b, row1.c).Equals(("", None, Some 1)) |> should equal true

row1 的运行时类型是System.Tuple&lt;string,Microsoft.FSharp.Core.FSharpOption&lt;string&gt;,Microsoft.FSharp.Core.FSharpOption&lt;int&gt;&gt;,所以即使这样在理论上也应该可以工作:

row1 |> should equal ("", None, Some 1)

事实上,当元组中没有 None 时它确实如此。

除了类型提供程序之外,我无法使用其他任何东西重现此行为。

【问题讨论】:

  • 嗯。您是否将string*string option*int optionstring*obj option*int option 进行比较?
  • 如果我这样做:let t = ("", None, Some 1) in (row1.a, row1.b, row1.c) |&gt; should equal t 工具提示说tstring*'a option*int option,所以它应该可以工作
  • 好的,我一直认为问题出在左侧而不是右侧,但在您发表评论后,我意识到这两个:(row1.a, row1.b, row1.c) |&gt; should equal ("", Option&lt;string&gt;.None, Some 1) 和这个:row1 |&gt; should equal ("", Option&lt;string&gt;.None, Some 1) 都有效。谢谢
  • 有趣...你可以试试Option&lt;string&gt;.None而不是None吗?
  • 是的,刚刚做了,这行得通。谢谢

标签: f# type-providers


【解决方案1】:

我们已经被这个咬过好几次了,所以我们在这个上面创建a specific note

FsUnit 使用类型测试来实现其 DSL。类型推断不适用于此 DSL,因此请确保两个比较值属于同一类型。

例如,对于一些泛型值,如TrueFalse 等,您需要指定它们的类型(如formula&lt;fol&gt;.Trueformula&lt;fol&gt;.False 等),否则这些值将被比较为类型obj.

如果您查看how FsUnit is implemented,,它并不是真正的类型安全的。我相信Jack P.'s pull request 是朝着使 FsUnit 更加类型安全迈出的一步。这似乎是一个需要改进 FsUnit 的领域。

【讨论】:

  • 我对空列表[] 有同样的问题。类型注释(在我的例子中是([]:list&lt;int&gt;))解决了它。
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 2021-06-13
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
相关资源
最近更新 更多