F# 如何同时报告语法和语义错误?
How can F# report syntax and semantic errors at same time?
这是一个 F# 代码,有语法和语义错误:
let a b = b b
let x = (if)
编辑:Vim 的 F# 报告无限类型错误和语法错误,但 fsc
或 fsi
仅在语法错误处停止。
F# for Vim 如何同时报告语法和语义错误,而 F# 编译器只报告语法错误?
F# 编译器(由 Vim 插件使用)有一个错误恢复机制 - 这意味着当它找到一个它无法解析的表达式时,它会尝试用一些东西填充它将使它成为有效的 F# 表达式。
当你写 let a = (if)
时,我猜编译器会在内部将其扩展为
let a = (if _ then _ else _)
其中 _
是一个特殊的 "invalid expression" 占位符。
这使得对无效的 F# 代码进行类型检查成为可能,这在 IDE 编写代码(通常无效)时非常有用,因为类型信息用于自动完成等
当 运行 编译器直接报告自动 "fixed" 代码中的类型检查错误是可能的,但可能不是那么有用 - 填充漏洞时,编译器可能并不总是做你期望的,所以这可能会给出奇怪的错误信息。
这是一个 F# 代码,有语法和语义错误:
let a b = b b
let x = (if)
编辑:Vim 的 F# 报告无限类型错误和语法错误,但 fsc
或 fsi
仅在语法错误处停止。
F# for Vim 如何同时报告语法和语义错误,而 F# 编译器只报告语法错误?
F# 编译器(由 Vim 插件使用)有一个错误恢复机制 - 这意味着当它找到一个它无法解析的表达式时,它会尝试用一些东西填充它将使它成为有效的 F# 表达式。
当你写 let a = (if)
时,我猜编译器会在内部将其扩展为
let a = (if _ then _ else _)
其中 _
是一个特殊的 "invalid expression" 占位符。
这使得对无效的 F# 代码进行类型检查成为可能,这在 IDE 编写代码(通常无效)时非常有用,因为类型信息用于自动完成等
当 运行 编译器直接报告自动 "fixed" 代码中的类型检查错误是可能的,但可能不是那么有用 - 填充漏洞时,编译器可能并不总是做你期望的,所以这可能会给出奇怪的错误信息。