F#如何同时报告语法和语义错误?

时间:2015-06-01 06:06:02

标签: f#

这是一个包含语法和语义错误的F#代码:

let a b = b b
let x = (if)

编辑:V#的F#报告无限类型错误和语法错误,但fscfsi仅在sytnax错误处停止。

enter image description here

F#如何同时报告语法和语义错误,而F#编译器仅停止报告语法错误?

1 个答案:

答案 0 :(得分:5)

F#编译器(由封面下的Vim插件使用)有一个错误恢复机制 - 这意味着当它找到一个无法解析的表达式时,它会尝试用一些能使其有效的F#表达式填充它

当你写let a = (if)时,我想编译器会在内部将其扩展为类似的东西 let a = (if _ then _ else _)其中_是一个特殊的“无效表达式”占位符。

这使得可以对无效的F#代码进行类型检查,这在编写代码时非常有用(通常无效),因为类型信息用于自动完成等。

直接运行编译器时报告自动“修复”代码中的类型检查错误是可能的,但可能没那么有用 - 填充漏洞时,编译器可能并不总是按照您的预期执行,因此这样做可能会给出奇怪的错误信息。