F#comprehension loop vars是否可变?

use*_*098 0 variables f# list-comprehension mutable

在列表comp.例如,变量是否使用了与let stmt中状态相同的实变量?如果是这样,它实际上是可变的,对吗?它每次都围绕循环被绑定到一个新的东西吧?

The*_*ght 7

不,它不是一个可变的变量.我们可以通过创建稍后调用以打印它的函数来看到这一点.

注意:

let printIs = [for i in 1..10 do yield fun () -> printf "%i " i]
printIs |> List.iter (fun f -> f())
Run Code Online (Sandbox Code Playgroud)

返回:

1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)

请注意,每个1..10值都会打印出来,因此i不能是一个可变变量,因为如果是,i10在循环完成后始终具有该值.实际上,符号i指的是列表理解中每一步的不同的不可变值.


如果我尝试用实际的可变变量来做这件事x,我会得到不同的行为:

let mutable x = 1
let printIs2 = 
    [for i in 1..10 do 
        x <- i
        yield fun () -> printf "%i " x]
printIs2 |> List.iter (fun f -> f())
Run Code Online (Sandbox Code Playgroud)

返回:

10 10 10 10 10 10 10 10 10 10
Run Code Online (Sandbox Code Playgroud)