Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net F#中的布尔值计算错误_.net_F# - Fatal编程技术网

.net F#中的布尔值计算错误

.net F#中的布尔值计算错误,.net,f#,.net,F#,我有一段F#代码: 然后调用func(),它的计算结果是正确的 为什么会这样?这似乎没有任何意义。您如何调用此代码?直接在主函数中使用sscce比较好。请参见此处:-特别是一个我们可以自己运行的小脚本。在这两种情况下,字节的值是多少?它是可变的吗?对于后一个版本,您将推迟对字节的求值,直到在func()中执行它为止。所讨论的代码的所有效果都是在丢弃的计算中使用字节序列的副作用。如果没有定义字节的副作用,这是相当模糊的。这真的是错误的吗?或者只是调试器的指示有误导性?是否启用了优化,如果启用,是否

我有一段F#代码:

然后调用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 () -> ()