F# - 基本语法

您已经了解了 F# 程序的基本结构,因此将很容易理解 F# 编程语言的其他基本构建块。

F# 中的令牌

F# 程序由各种标记组成。 标记可以是关键字、标识符、常量、字符串文字或符号。 我们可以将 F# 令牌分为两种类型−

  • 关键字
  • 符号和运算符

F# 关键字

下表显示了关键字以及关键字的简要说明。 我们将在后续章节中讨论这些关键字的使用。

关键字 描述
abstract 表示一个方法,该方法在声明它的类型中没有实现,或者是虚拟的并且具有默认实现。
and 用于相互递归绑定、属性声明以及对泛型参数的多重约束。
as 用于给当前类对象一个对象名。 还用于为模式匹配中的整个模式命名。
assert 用于在调试过程中验证代码。
base 用作基类对象的名称。
begin 在详细语法中,表示代码块的开始。
class 在详细语法中,表示类定义的开始。
default 表示抽象方法的实现; 与抽象方法声明一起使用来创建虚拟方法。
delegate 用于声明委托。
delegate 用于循环构造或执行命令式代码。
done 在详细语法中,表示循环表达式中代码块的结尾。
downcast 用于转换为继承链中较低的类型。
downto for表达式中,在反向计数时使用。
elif 用于条件分支。 else if 的缩写形式。
else 用于条件分支。
end

在类型定义和类型扩展中,表示成员定义部分的结尾。

在详细语法中,用于指定以 begin 关键字开头的代码块的结尾。

exception 用于声明异常类型。
extern 表示声明的程序元素是在另一个二进制文件或程序集中定义的。
false 用作布尔文字。
finally 与try一起使用,引入无论是否发生异常都执行的代码块。
for 用于循环构造。
fun 用于 lambda 表达式,也称为匿名函数。
function 用作 fun 关键字和 lambda 表达式中的匹配表达式的更短替代品,该表达式对单个参数进行模式匹配。
global 用于引用顶级.NET命名空间。
if 用于条件分支结构。
in 用于序列表达式,并在详细语法中用于将表达式与绑定分开。
inherit 用于指定基类或基接口。
inline 用于指示应直接集成到调用者代码中的函数。
interface 用于声明和实现接口。
internal 用于指定成员在程序集内部可见,但在程序集外部不可见。
lazy 用于指定仅在需要结果时才执行的计算。
let 用于将名称关联或绑定到值或函数。
let! 在异步工作流中用于将名称绑定到异步计算的结果,或者在其他计算表达式中用于将名称绑定到计算类型的结果。
match 用于通过将值与模式进行比较来进行分支。
member 用于声明对象类型中的属性或方法。
module 用于将名称与一组相关类型、值和函数相关联,以在逻辑上将其与其他代码分开。
mutable 用于声明一个变量,即可以改变的值。
namespace 用于将名称与一组相关类型和模块相关联,以在逻辑上将其与其他代码分开。
new

用于声明、定义或调用创建或可以创建对象的构造函数。

也用于泛型参数约束,以指示类型必须具有特定的构造函数。

not 实际上不是关键字。 但是,不组合结构体用作通用参数约束。
null

表示不存在对象。

也用于通用参数约束。

of 在可区分联合中用于指示值类别的类型,以及在委托和异常声明中使用。
open 用于使命名空间或模块的内容无需限定即可使用。
or

与布尔条件一起用作布尔或运算符。 相当于 ||。

也用于成员约束。

override 用于实现与基本版本不同的抽象或虚拟方法的版本。
private 限制对成员的访问只能使用相同类型或模块中的代码。
public 允许从类型外部访问成员。
rec 用于指示函数是递归的。
return 用于指示作为计算表达式的结果提供的值。
return! 用于指示计算表达式,该计算表达式在求值时提供包含计算表达式的结果。
select 在查询表达式中用于指定要提取的字段或列。 请注意,这是一个上下文关键字,这意味着它实际上不是保留字,它仅在适当的上下文中充当关键字。
static 用于指示无需类型实例即可调用的方法或属性,或在类型的所有实例之间共享的值成员。
struct

用于声明结构类型。

也用于通用参数约束。

用于模块定义中的 OCaml 兼容性。

then

用于条件表达式。

还用于在对象构造之后执行副作用。

to 在for循环中用于指示范围。
true 用作布尔文字。
try 用于引入可能生成异常的代码块。 与with或finally一起使用。
type 用于声明类、记录、结构、可区分联合、枚举类型、度量单位或类型缩写。
upcast 用于转换为继承链中较高级别的类型。
use 对于需要调用 Dispose 来释放资源的值,使用它而不是 let。
use! 使用而不是让! 在异步工作流程和其他需要调用 Dispose 来释放资源的值的计算表达式中。
val 在有限的情况下,在签名中用于指示值,或在类型中用于声明成员。
void 表示 .NET void 类型。 与其他 .NET 语言互操作时使用。
when 用于模式匹配上的布尔条件(当保护时),并为泛型类型参数引入约束子句。
while 引入循环结构。
with 与模式匹配表达式中的 match 关键字一起使用。 还用于对象表达式、记录复制表达式和类型扩展中,以引入成员定义和引入异常处理程序。
yield 在序列表达式中使用以生成序列值。
yield! 在计算表达式中使用,将给定计算表达式的结果附加到包含计算表达式的结果集合中。

一些保留关键字来自 OCaml 语言 −

asr land lor lsl lsr lxor mod sig

保留一些其他保留关键字以供将来扩展 F#。

atomic break checked component const constraint constructor
continue eager event external fixed functor include
方法 mixin object parallel process protected pure
sealed tailcall trait virtual volatile

F# 中的注释

F#提供两种类型的注释 −

  • 单行注释以 // 符号开头。
  • 多行注释以 (* 开头,以 *) 结尾。

F# 中的基本程序和应用程序入口点

通常,F# 程序没有任何显式入口点。 当您编译 F# 应用程序时,提供给编译器的最后一个文件将成为入口点,并且该文件中的所有顶级语句都会从上到下执行。

一个编写良好的程序应该有一个单独的顶级语句来调用程序的主循环。

一个非常简约的 F# 程序,将在屏幕上显示"Hello World" −

(* This is a comment *)
(* Sample Hello World program using F# *)
printfn "Hello World!"

当您编译并执行该程序时,它会产生以下输出 −

Hello World!