F#序列比较

栏目: ASP.NET · 发布时间: 5年前

内容简介:翻译自: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#序列比较》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Creative Curve

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》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具