为什么 F# interactive 不标记此错误?
Why doesn't F# interactive flag this error?
我有一些几百行的代码。它的许多小块具有以下结构:
let soa =
election
|> Series.observations
printfn "%A" <| soa
经常发生两件事:
1) 最后一行神秘地改为:
printfn "%A" <|
这样上面的代码和后面的代码就变成了
let soa =
election
|> Series.observations
printfn "%A" <|
let sls =
election
|> Series.sample (seq ["Party A"; "Party R"])
printfn "%A" <| sls
这发生在我在编辑器中编辑文件的上方数百行。
2) 发生这种情况时 F# Interactive
不会标记错误。不会生成任何错误消息。但是,如果我尝试访问 sls
,我会收到消息:
error FS0039: The value or constructor 'sls' is not defined.
关于为什么在编辑器中删除了一些代码有什么想法吗? (这种情况经常发生)
为什么 F# Interactive
不发出错误消息?
第二个 let
块被解释为前面 printfn
的参数,因为管道作为运算符,为偏移规则提供了一个例外:运算符的第二个参数不必须比第一个参数缩进更远。由于第二个 let
块不在顶层,而是 printfn
参数的一部分,因此外部无法访问它的定义。
让我们尝试一些实验:
let f x = x+1
// Normal application
f 5
// Complex expression as argument
f (5+6)
// Let-expression as argument
f (let x = 5 in x + 6)
// Replacing the `in` with a newline
f ( let x = 5
x + 6 )
// Replacing parentheses with pipe
f <|
let x = 5
x + 6
// Operators (of which the pipe is one) have an exception to the offset rule.
// This is done to support flows like this:
[1;2;3] |>
List.map ((+) 1) |>
List.toArray
// Applying this exception to the `f` + `let` expression:
f <|
let x = 5
x + 6
我有一些几百行的代码。它的许多小块具有以下结构:
let soa =
election
|> Series.observations
printfn "%A" <| soa
经常发生两件事:
1) 最后一行神秘地改为:
printfn "%A" <|
这样上面的代码和后面的代码就变成了
let soa =
election
|> Series.observations
printfn "%A" <|
let sls =
election
|> Series.sample (seq ["Party A"; "Party R"])
printfn "%A" <| sls
这发生在我在编辑器中编辑文件的上方数百行。
2) 发生这种情况时 F# Interactive
不会标记错误。不会生成任何错误消息。但是,如果我尝试访问 sls
,我会收到消息:
error FS0039: The value or constructor 'sls' is not defined.
关于为什么在编辑器中删除了一些代码有什么想法吗? (这种情况经常发生)
为什么 F# Interactive
不发出错误消息?
第二个 let
块被解释为前面 printfn
的参数,因为管道作为运算符,为偏移规则提供了一个例外:运算符的第二个参数不必须比第一个参数缩进更远。由于第二个 let
块不在顶层,而是 printfn
参数的一部分,因此外部无法访问它的定义。
让我们尝试一些实验:
let f x = x+1
// Normal application
f 5
// Complex expression as argument
f (5+6)
// Let-expression as argument
f (let x = 5 in x + 6)
// Replacing the `in` with a newline
f ( let x = 5
x + 6 )
// Replacing parentheses with pipe
f <|
let x = 5
x + 6
// Operators (of which the pipe is one) have an exception to the offset rule.
// This is done to support flows like this:
[1;2;3] |>
List.map ((+) 1) |>
List.toArray
// Applying this exception to the `f` + `let` expression:
f <|
let x = 5
x + 6