【发布时间】:2013-06-14 04:54:39
【问题描述】:
我已经实现了一个斐波那契数列生成器,如下所示
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);; -
@WeiMa:要了解发生了什么,请尝试在 FSI 中使用真正序列
seq {1..3} = seq {1..3}的一些不同的简单案例 - 这个表达式等于false -
谢谢各位,我知道了。
标签: f#