首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Seq.length调用上的“输入序列有足够数量的元素”?

Seq.length调用上的“输入序列有足够数量的元素”?
EN

Stack Overflow用户
提问于 2015-03-07 22:29:14
回答 1查看 356关注 0票数 0

我正在研究Matasano Crypto的挑战,但我遇到了一个奇怪的错误。我有一个整数集合,在调用Seq.length (或Seq.sum)时,我得到一个“System.InvalidOperationException”,并解释为“输入序列的元素数量不足”。通常,此错误与调用Seq.take或类似的空Seq相关联,但此Seq不是空的,也不是通常会导致此类异常的调用。

代码语言:javascript
复制
let HammingDistance (b1:seq<byte>) (b2:seq<byte>) : int =
    let bytePairs = Seq.zip b1 b2
    let HammingWeight (b:byte) =
        let bitPositions = {0 .. 7}
        let isSet (byte1:byte) (offset:int) = if (byte1 &&& ((byte 1) <<< offset)) > (byte 0) then 1 else 0
        Seq.map (isSet b) bitPositions |> Seq.sum
    let HammingDistanceBytes (byte1, byte2) =
        HammingWeight (byte1 ^^^ byte2)
    let distances = Seq.map HammingDistanceBytes bytePairs
    printfn "Distances: %A" distances
    printfn "Distances length: %d" (Seq.length distances)
    Seq.sum distances

异常之前的最后几行输出如下:

代码语言:javascript
复制
Distances length: 1435
Distances: seq [3; 3; 1; 5; ...]
Distances length: 1436
Distances: seq [3; 6; 2; 1; ...]
Distances length: 1437
Distances: seq [0; 3; 2; 3; ...]
Distances length: 1438
Distances: seq [3; 3; 4; 2; ...]

有人能解释为什么会发生这种异常,或者给出我应该采取的进一步诊断问题的步骤吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-07 22:50:20

这里的问题与延迟评估有关--首先不可能生成b2,因为它是从更大的列表中派生出来的:

代码语言:javascript
复制
// message:seq<byte>        
let firstKeysizeBytes = Seq.take keysize message
let secondKeysizeBytes = Seq.skip keysize message |> Seq.take keysize

在最终的序列被强制评估之前,异常是不会弹出的。错误信息的放置非常令人困惑,但这就是懒惰评估的生活。我可能应该使用严格的顺序类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28920806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档