.net F#中的布尔值计算错误
我有一段F#代码: 然后调用func(),它的计算结果是正确的.net F#中的布尔值计算错误,.net,f#,.net,F#,我有一段F#代码: 然后调用func(),它的计算结果是正确的 为什么会这样?这似乎没有任何意义。您如何调用此代码?直接在主函数中使用sscce比较好。请参见此处:-特别是一个我们可以自己运行的小脚本。在这两种情况下,字节的值是多少?它是可变的吗?对于后一个版本,您将推迟对字节的求值,直到在func()中执行它为止。所讨论的代码的所有效果都是在丢弃的计算中使用字节序列的副作用。如果没有定义字节的副作用,这是相当模糊的。这真的是错误的吗?或者只是调试器的指示有误导性?是否启用了优化,如果启用,是否
为什么会这样?这似乎没有任何意义。您如何调用此代码?直接在主函数中使用sscce比较好。请参见此处:-特别是一个我们可以自己运行的小脚本。在这两种情况下,
字节的值是多少?它是可变的吗?对于后一个版本,您将推迟对字节的求值,直到在func()
中执行它为止。所讨论的代码的所有效果都是在丢弃的计算中使用字节序列的副作用。如果没有定义字节
的副作用,这是相当模糊的。这真的是错误的吗?或者只是调试器的指示有误导性?是否启用了优化,如果启用,是否可以有效地删除有问题的代码?这种代码风格——使用Seq.toList |>ignore
来计算一个命名不明显的值——很奇怪,我认为这是混乱的一部分。(如果你真的想保留这个,Seq.iter ignore
会更清楚地提示副作用。)
let readBytes isVariable (br: BinaryReader) =
seq {
while br.BaseStream.Position < br.BaseStream.Length do
let c = br.PeekChar()
if c = 0 && isVariable
then
yield Array.get (br.ReadBytes(2)) 1
else yield br.ReadByte()
}
let main argv =
let processCopybook = readLines copybookFile
|> Seq.map (fun x -> parseElement' x parserList)
|> Seq.filter (fun s -> not (s = []))
|> Seq.map makeElementFromTokenLine
|> makeTree
let isVariable = isVariableLength processCopybook
let br = lazy(new BinaryReader(new FileStream(dataFile, FileMode.Open)))
let bytes = readBytes isVariable br.Value
if isVariable
then Seq.takeWhile (fun c -> not (c = byte 0x0A)) bytes |> Seq.toList |> ignore
else ()
let func = if isVariable
then fun () -> Seq.takeWhile (fun c -> not (c = byte 0x0A)) bytes |> Seq.toList |> ignore
else fun () -> ()