我正在研究Matasano Crypto的挑战,但我遇到了一个奇怪的错误。我有一个整数集合,在调用Seq.length (或Seq.sum)时,我得到一个“System.InvalidOperationException”,并解释为“输入序列的元素数量不足”。通常,此错误与调用Seq.take或类似的空Seq相关联,但此Seq不是空的,也不是通常会导致此类异常的调用。
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异常之前的最后几行输出如下:
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; ...]有人能解释为什么会发生这种异常,或者给出我应该采取的进一步诊断问题的步骤吗?
发布于 2015-03-07 22:50:20
这里的问题与延迟评估有关--首先不可能生成b2,因为它是从更大的列表中派生出来的:
// message:seq<byte>
let firstKeysizeBytes = Seq.take keysize message
let secondKeysizeBytes = Seq.skip keysize message |> Seq.take keysize在最终的序列被强制评估之前,异常是不会弹出的。错误信息的放置非常令人困惑,但这就是懒惰评估的生活。我可能应该使用严格的顺序类型。
https://stackoverflow.com/questions/28920806
复制相似问题