Я начал использовать 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
Обратите внимание, что «должно равняться 23», которое я получаю из FsUnit.Вот как FsUnit определяет это:
let = x = new 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 #, чтобы она могла использоваться вместе с равными.F # не поддерживает перегрузку методов, так что, похоже, я не могу определить его таким образом, чтобы «равно» можно было использовать отдельно или вместе с «внутри».
Есть идеи?