gpt4 book ai didi

f# - 类型提供者中奇怪的 None 行为

转载 作者:行者123 更新时间:2023-12-04 20:01:07 24 4
gpt4 key购买 nike

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

当我在这些属性中有一个带有“”、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<string,Microsoft.FSharp.Core.FSharpOption<string>,Microsoft.FSharp.Core.FSharpOption<int>> ,所以即使这在理论上也应该有效:

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

事实上,当没有 None 时它会起作用在元组中。

除了类型提供者之外,我无法重现此行为。

最佳答案

我们被这个问题困扰了好几次,所以我们创建了 a specific note对此:

FsUnit uses type test to implement its DSL. Type inference doesn't work on this DSL, so make sure that two compared values belong to the same type.

例如,对于一些通用值,例如 True , False等,您需要指定它们的类型(如 formula<fol>.Trueformula<fol>.False 等),否则这些值将被比较为 obj 类型.

如果你看一下how FsUnit is implemented,它不是真正的类型安全。我相信Jack P.'s pull request是使 FsUnit 更加类型安全的一步。这似乎是 FsUnit 需要改进的地方。

关于f# - 类型提供者中奇怪的 None 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com