我已经实现了一个斐波那契数列生成器,如下所示
let getNext upperLimit current=
let (e1, e2) = current
let next = e1 + e2
if next > upperLimit then None
else Some (next, (e2,next))
let fib upperLimit = (0,1) |> Seq.unfold (getNext upperLimit) |> Seq.append [0;1]
我的测试代码是
[<Test>]
member Spec.``fib not exeeding 20 should be 0,1,1,2,3,5,8,13``()=
let expected = seq [0;1;1;2;3;5;8;13]
let result = fib 20
let expectedSameAsResult = (expected = result)
printfn "Expected: %A Result: %A result length: %d" expected result (Seq.length result)
Assert.That expectedSameAsResult
测试失败,打印结果为
预期:[0; 1个;1个;2;3;5个;8个;13] 结果:seq [0; 1个;1个;2;...] 结果长度:8
当我使用 for 循环打印结果中的每个元素时,我得到了预期序列中完全相同的元素。
那么,期望序列和结果序列有什么区别呢?
编辑:我的实现可以在https://github.com/weima/EulerProblems/tree/master/EulerProblems
编辑:为了回答 John Palmer 的回答 ,我刚刚在 F# 交互窗口中写了一个测试
let a = seq[1;2;3]
let b = seq[1;2;3]
let c = a = b;;
我得到的结果是 val a : seq = [1; 2;3] val b : seq = [1; 2;3] val c : bool = true
所以 F# 也可以对序列进行结构比较。
编辑以反映 Gene Belitski 的回答 我已将测试更改为
[<Test>]
member Spec.``fib not exeeding 20 should be 0,1,1,2,3,5,8,13``()=
let expected = seq [0;1;1;2;3;5;8;13]
let result = Problem2.fib 20
let comparedResult = Seq.compareWith (fun a b -> a - b) expected result
let expectedSameAsResult = (comparedResult = 0)
Assert.That expectedSameAsResult
它现在起作用了。谢谢!但我仍然不明白为什么简单的 seq[1;2;3]=seq[1;2;3] 有效,但我的测试用例却没有。