内容简介:翻译自:https://stackoverflow.com/questions/17101329/f-sequence-comparison
我已经实现了如下的Fibonacci序列生成器
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会比较序列的元素,但实际上a = b会计算参考相等性.
你可以用类似的东西看到这个
seq {1..3} = seq {1..3}
返回false.
但是,在某些情况下,当您使用常量时,您会得到令人困惑的结果
seq [1;2;3] = seq [1;2;3]
返回true,这很令人困惑.
要避免此问题,您需要执行类似的操作
let test a b = Seq.fold (&&) true (Seq.zip a b |> Seq.map (fun (aa,bb) -> aa=bb))
比较元素.
或者,您可以使用Gene的答案中概述的Seq.compareWith.然而,这要求元素也实现比较运算符以及相等性,对于诸如实现=但不进行比较的区分联合的某些事情可能不是这种情况.
翻译自:https://stackoverflow.com/questions/17101329/f-sequence-comparison
以上所述就是小编给大家介绍的《F#序列比较》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 【剖析 | SOFARPC 框架】系列之 SOFARPC 序列化比较
- React与Vue模板使用比较(一、vue模板与React JSX比较)
- 从全方位为你比较3种数据科学工具的比较:Python、R和SAS(附链接)
- (翻译)前端构建工具的比较
- 0615 - 没有比较,就没有伤害
- 精读《如何比较 Object 对象》
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Creative Curve
Allen Gannett / Knopf Doubleday Publishing Group / 2018-6-12
Big data entrepreneur Allen Gannett overturns the mythology around creative genius, and reveals the science and secrets behind achieving breakout commercial success in any field. We have been s......一起来看看 《The Creative Curve》 这本书的介绍吧!