7

我正在自学 F# 我通常是 C# 程序员。

当我浏览这些章节时,我正在尝试使用(**)为自己做笔记,但我从评论本身中得到了一个错误。

module Characters

let vowels = ['a', 'e', 'i', 'o', 'u']

printfn "Hex u0061 = '%c'" '\u0061'

(*  <------------Error is here, is 'End of file in string embedded in comment begun at or before here'
    Character Escape Sequences

    Character       Meaning
    -------------------------------
    \'              Single Quote
    \"              Double Quote
    \\              Backslash
    \b              Backspace
    \n              Newline
    \r              Carriage Return
    \t              Horisontal Tab
*)

这是否将评论视为字符串意味着我必须逃避我的评论?

4

2 回答 2

14

F#琐事时间!这是设计使然。 块注释可以嵌套,块注释中的字符串像常规字符串一样被标记化。在这种情况下,有效的 char 文字算作“字符串”。

所以这些是有效的块注释:

(* "embedded string, this --> *) doesn't close the comment" *)
(*  (* nested *) comment *)
(* quote considered to be in char literal '"' is ok *)

但这些都不是

(* "this string is not closed *)
(* " this quote --> \" is escaped inside a string *)

好像这还不够疯狂,对以since等开头的运算符进行特殊处理,*(*)通常被认为是块注释的开始或结束。

(* I can talk about the operator (*) without ending my comment *)

AFAIK,这些都是从 ML 继承的(嵌套注释肯定是,不确定字符串)。

因此,出于您的目的,您可能想要执行以下操作:

(*  Character       Meaning
    -------------------------------
    " \' "          Single Quote
    " \" "          Double Quote

    or

    '\''            Single Quote
    '"'             Double Quote
*)
于 2013-08-08T18:49:58.650 回答
2

看来“双引号”行是问题所在。如果我删除该行,错误就会消失。//这看起来像是解析器中的错误,因为如果我在每一行前面加上而不是进行块注释,则不会出现问题。我建议您将其发送至 fsbugs@microsoft.com - 如果它尚未针对 Visual Studio 2013 进行修复,也许现在还为时不晚。

完全不相关:您的vowels列表包含一个由 5 部分组成的元组的单个元素。如果您希望它是字符列表而不是包含一个 5 部分元组的列表,请使用分号而不是逗号。

于 2013-08-08T17:56:52.727 回答