Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候在F#中加上双分号?_F# - Fatal编程技术网

什么时候在F#中加上双分号?

什么时候在F#中加上双分号?,f#,F#,这是一个愚蠢的问题。我一直在读几本关于F#的书,但找不到任何解释当你把;;在陈述之后,我也无法在阅读中找到模式。什么时候用双分号结束语句?符号和运算符引用(F#) 分号: •分离表达式(主要用于详细语法) •分离列表中的元素 •分隔记录的字段 双分号: 《F#NET》杂志上的文章引用了互动会话中出现的F#代码。具体来说,交互式会话提供了一个>提示符,需要一个双分号;;代码段末尾的标识符,以强制求值,并返回结果定义和值的名称(如果有)和类型 双分号没有任何用途(F#interactive之外)

这是一个愚蠢的问题。我一直在读几本关于F#的书,但找不到任何解释当你把;;在陈述之后,我也无法在阅读中找到模式。什么时候用双分号结束语句?

符号和运算符引用(F#)

分号:

•分离表达式(主要用于详细语法)

•分离列表中的元素

•分隔记录的字段

双分号:


《F#NET》杂志上的文章引用了互动会话中出现的F#代码。具体来说,交互式会话提供了一个>提示符,需要一个双分号;;代码段末尾的标识符,以强制求值,并返回结果定义和值的名称(如果有)和类型

双分号没有任何用途(F#interactive之外)。分号:

  • 分隔表达式(主要用于 在详细语法中)
  • 分开 列表的元素
  • 分开 记录的字段
因此,首先,
将第一个分号之前的表达式与第二个分号之前的空表达式分离,并将该空表达式与第二个分号之后的任何表达式分离(如C#或C++)

在列表实例中,我怀疑您在定义空列表元素时会遇到错误

关于记录,我怀疑这类似于分隔表达式,实际上忽略了分号之间的空白

F#interactive在看到双分号时执行输入的F#


[更新以涵盖F#interactive-由提供)

双分号很可能来自OCaml,因为这是该语言的基础。 看

基本上,它是用于历史目的的,您需要它用于(repl)如果您使用它。

您是在谈论F#property还是在F#Interactive中运行F#函数?在F#Interactive中,强制执行刚刚输入的代码。除此之外;;在F#中没有我所知道的任何特殊含义,

,唯一需要的地方是在交互模式中结束表达式

是从OCaml转换而来的,而OCaml转换又是从Caml灯光转换而来的。最初
用于结束顶级“短语”--也就是说,
let
type
,等等。OCaml使
成为可选的,因为典型的模块由一系列
let
语句组成,可能在末尾有一条语句来调用主函数。如果您偏离此模式,则需要用
分隔语句。不幸的是,在OCaml中n
是可选的,而必选的则很难学习

但是,F#对OCaml语法引入了两个相关的修改:缩进和
do
。顶级语句必须放在
do
块中,而块需要缩进,因此F#始终知道每个顶级语句都以
do
开头,以缩进结尾。不再是
re要求

总的来说,您需要知道的是[O']Caml的语法很糟糕,F#修复了它的许多问题,但保持了许多令人困惑的向后兼容性(我相信F#仍然可以编译很多OCaml代码)


注意:这个答案是基于我使用OCaml的经验和(不幸的是,除非你了解OCaml,否则这不是很有启发性)。

然后
表示函数声明的结束

那么什么是#light语法呢?它附带了#light声明:

#光明宣言 空格有效。允许 开发人员忽略某些关键字 例如,;,;,开始和结束

下面是一段没有#light语法的代码:

let halfWay a b =
  let dif =  b - a in
  let mid = dif / 2 in
  mid + a;;
#light
let halfWay a b =
  let dif =  b - a
  let mid = dif / 2
  mid + a
并变得具有轻语法:

let halfWay a b =
  let dif =  b - a in
  let mid = dif / 2 in
  mid + a;;
#light
let halfWay a b =
  let dif =  b - a
  let mid = dif / 2
  mid + a
如前所述,您现在可以省略#light声明(如果您使用的是最新的CTP或Visual Studio 2010,则应该如此)

如果您想了解更多关于#light语法的信息,请参阅此线程:

在不应该与OCaml兼容的非交互式F#代码中,您不需要使用双分号。在OCaml兼容模式中,您可以在顶级函数声明的末尾使用它(在最新版本中,您可以通过使用扩展名为
.ml
的文件或在顶部添加
#light“off”
来切换到此模式)

如果在Visual Studio中使用命令行
fsi.exe
工具或F#Interactive,则应使用
结束F#的当前输入

当我在StackOverflow发布代码示例时(以及在中的代码示例中),当我还想在F#interactive中显示表达式求值结果时,我会在列表中使用

  • 从F#interactive上市

    > "Hello" + " world!";;
    val it : string = "Hello world!"
    > 1 + 2;;
    val it : int = 3
    
    let n = 1 + 2
    printf "Hello world!"
    
  • 标准F#源代码

    > "Hello" + " world!";;
    val it : string = "Hello world!"
    > 1 + 2;;
    val it : int = 3
    
    let n = 1 + 2
    printf "Hello world!"
    

有时将输出显示为列表的一部分也很有用,所以我觉得这个符号非常有用,但我从来没有在任何地方解释过,所以你问这个问题真是太好了!

双分号的历史可以追溯到ML的开始,当时分号被用作列表中的分隔符而不是逗号und 50:15迈克·戈登提到:

有一次关于F#的演讲,有人问“为什么F#命令的末尾有双分号?”原因是原始ML中列表中的分隔符是分号,所以如果您想要列表1;2;3;并将其放在单独的l上