F#序列比较

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

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

查看所有标签

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

洞察人心

洞察人心

Steve Portigal / 张振东、蒋晓、戴传庆、孙启玉 / 电子工业出版社 / 2015-10 / 65.00元

用户在哪里,有什么需求?他们为什么会选用竞争对手的产品而不是你的?从大数据中固然能得出一些结论,但是要搞清楚作为地球上顶级复杂生物的人的真实想法,还是走近他们,面对面访谈更直接有效。 用户访谈是一项技能,与一般的交谈有本质上的区别,需要遵从一定的步骤和方法。优秀的采访者用最自然的方式和用户进行交流,看似不经意,而实际上该说什么、何时说、如何说以及什么时候应该沉默,都有精准的权衡,都试图在闲聊......一起来看看 《洞察人心》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具