Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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#_Language Specifications - Fatal编程技术网

F# 为什么是;“做”;允许在函数中使用?

F# 为什么是;“做”;允许在函数中使用?,f#,language-specifications,F#,Language Specifications,我注意到以下代码在VS 2013中编译并运行: let f() = do Console.WriteLine(41) 42 但是当我查看F#3.0规范时,我找不到任何关于以这种方式使用do。据我所知,do可以有以下用途: 作为循环的一部分(例如,expr do expr done),这里的情况并非如此 内部计算表达式,例如: seq { for i in 1..2 do do Console.WriteLine(i) yield i * 2 } 这里

我注意到以下代码在VS 2013中编译并运行:

let f() =
    do Console.WriteLine(41)
    42
但是当我查看F#3.0规范时,我找不到任何关于以这种方式使用
do
。据我所知,
do
可以有以下用途:

  • 作为循环的一部分(例如,expr do expr done),这里的情况并非如此
  • 内部计算表达式,例如:

    seq {
        for i in 1..2 do
        do Console.WriteLine(i)
        yield i * 2
    }
    
    这里也不是这样,
    f
    不包含任何计算表达式

    虽然这里让我感到困惑的是,根据规范,
    do
    后面应该跟着
    in
    。由于轻量级语法的原因,中的
    应该是可选的,但是在这里添加它会导致编译错误(“意外标记”in“或不完整的表达式”)

  • 模块或类中的语句。这里的情况也并非如此,
    do
    位于函数内部,而不是模块或类内部

我还注意到,使用
#light“off”
,代码不会编译(“绑定中意外的关键字'do')),但我在轻量级语法部分也没有找到任何解释

基于所有这些,我假设在函数中以这种方式使用
do
不应该编译,但它确实可以。我在说明书中遗漏了什么吗?或者这实际上是编译器或规范中的错误?

来自:

do
绑定用于执行代码而不定义函数或值

即使规范没有包含一个全面的允许位置列表,但它只是一个声明为
unit
类型的表达式。一些例子:

if ((do ()); true) then ()
let x: unit = do ()
它通常被省略。在没有
do
的情况下,前面的每个示例都是有效的。因此,
do
仅用于断言表达式的类型为
unit
通过表达式语法将
do expr
作为
类函数或值defn
(类型)[ch8,a.2.5]和
模块函数或值defn
(模块)[ch10,a.2.1.1]的选择

在规范中,我实际上没有看到
函数defn
可以有多个表达式,只要最后一个表达式以外的所有表达式都计算为
单位
——或者在确定函数返回值时忽略除最后一个表达式以外的所有表达式


因此,这似乎是文档中的一个疏忽。

它被称为
do
绑定。我在规范中找不到它,但它是。@Daniel这是我提到的第三种情况,
do
在模块中。“当您希望独立于函数执行代码时,请使用do绑定”来完成引号:独立于函数*或值定义*。第二种情况可能适用于函数中。模块函数或值defn的定义可能与此相关:
module Foo=do()
也不使用
#light“off”
编译。独立于函数将描述顶级
do
绑定(在模块或类构造函数中)。其他
do
绑定可能出现在允许
单元
表达式的任何位置。我认为规范不允许它,因为它没有被列为
expr
(§6和§a.2.3)的选择之一。在过去几年中,我看到了许多在函数或方法中使用
do
的示例。如果这种行为不是故意的,那么在这一点上它实际上是有效的。然而,我认为情况并非如此,规范在这一点上是不完整的。“我在规范中没有看到
function defn
可以有多个表达式”,这要归功于
expr=expr;expr
规则以及轻量级语法使分号成为可选的事实。