簡體   English   中英

在Seq.length調用中“輸入序列的元素數量不足”?

[英]“The input sequence has an insufficient number of elements” on a Seq.length call?

我正在研究Matasano加密挑戰,但遇到一個奇怪的錯誤。 我有一個整數的Seq,並且在調用Seq.length(或Seq.sum)時,得到一個“ System.InvalidOperationException”,解釋為“輸入序列的元素數不足。” 通常,此錯誤與在空的Seq上調用Seq.take或類似事件有關,但是此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; ...]

誰能解釋為什么會發生這種異常,或者給出我應該采取的進一步診斷問題的步驟?

這里的問題與延遲評估有關-首先無法生成b2,因為它是從較大的列表派生的:

// message:seq<byte>        
let firstKeysizeBytes = Seq.take keysize message
let secondKeysizeBytes = Seq.skip keysize message |> Seq.take keysize

直到最終序列被強制評估時,該異常才會彈出。 錯誤消息的放置非常令人困惑,但這就是懶惰求生的生活。 我可能應該轉向使用嚴格的順序類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM