这是一个包含语法和语义错误的F#代码:
let a b = b b
let x = (if)
编辑:V#的F#报告无限类型错误和语法错误,但fsc
或fsi
仅在sytnax错误处停止。
F#如何同时报告语法和语义错误,而F#编译器仅停止报告语法错误?
答案 0 :(得分:5)
F#编译器(由封面下的Vim插件使用)有一个错误恢复机制 - 这意味着当它找到一个无法解析的表达式时,它会尝试用一些能使其有效的F#表达式填充它
当你写let a = (if)
时,我想编译器会在内部将其扩展为类似的东西
let a = (if _ then _ else _)
其中_
是一个特殊的“无效表达式”占位符。
这使得可以对无效的F#代码进行类型检查,这在编写代码时非常有用(通常无效),因为类型信息用于自动完成等。
直接运行编译器时报告自动“修复”代码中的类型检查错误是可能的,但可能没那么有用 - 填充漏洞时,编译器可能并不总是按照您的预期执行,因此这样做可能会给出奇怪的错误信息。