gpt4 book ai didi

f# - FsUnit 和检查 float 的相等性

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

我开始使用 FsUnit 来测试 F# 代码。它使得以 F# 风格表达断言成为可能,例如:

[<Test>]
member this.``Portugal voted for 23 countries in 2001 Eurovision contest``() =
this.totalVotes
|> getYearVotesFromCountry "Portugal" 2001
|> Seq.length
|> should equal 23

注意我从 FsUnit 得到的“应该等于 23”。以下是 FsUnit 定义它的方式:

让等于 x = 新的 EqualConstraint(x)

有了浮点数,就没有那么简单了。我必须在方法内使用 EqualConstraint。它自然适合 C#:
Assert.That(result).Is.EqualTo(1).Within(0.05);

当然,我希望能够用 F# 编写:
result |> should equal 1 within 0.05

但这不起作用。我最终定义了一个新函数:
let almostEqual x = (new EqualConstraint(x)).Within(0.01)

或者如果我想参数化精度,我可以将其指定为第二个参数:
let equalWithin x y = (new EqualConstraint(x)).Within(y)

但没有一个是漂亮的。我想为 F# 以更自然的方式定义“内”函数,以便它可以与 equal 一起使用。 F# 不支持方法重载,所以看起来我无法以这样的方式定义它,因此“相等”可以单独使用或与“内部”一起使用。

有任何想法吗?

最佳答案

这是一个有趣的问题!我不认为你可以附加 within 0.05should equal 的现有定义以任何方式。为此,您需要将参数添加到 should函数,但需要在库中有固定数量的参数。

在 F# 中优雅地编写它的一种方法是创建自定义运算符 +/- .请注意,您仍然需要使用括号,但它看起来很整洁:

0.9 |> should equal (1.0 +/- 0.5)

该运算符只是构造了一些需要在 equal 中显式处理的特殊类型的值。功能。这是实现:
type Range = Within of float * float
let (+/-) (a:float) b = Within(a, b)

let equal x =
match box x with
| :? Range as r ->
let (Within(x, within)) = r
(new EqualConstraint(x)).Within(within)
| _ ->
new EqualConstraint(x)

关于f# - FsUnit 和检查 float 的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3205453/

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