我已按以下方式实现了斐波那契数列生成器
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] 起作用,而我的测试案例却不起作用。
a=(b|> Seq.map id);;
- John Palmerseq {1..3} = seq {1..3}
- 这个表达式等于false
。 - Gene Belitski