F# - 基本语法



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

F#中的标记

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

  • 关键字
  • 符号和运算符

F#关键字

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

关键字 描述
abstract 指示一个方法,该方法在其声明的类型中没有实现,或者该方法是虚方法并具有默认实现。
and 用于相互递归绑定、属性声明以及泛型参数上的多个约束。
as 用于为当前类对象赋予一个对象名称。也用于为模式匹配中的整个模式命名。
assert 用于在调试期间验证代码。
base 用作基类对象的名称。
begin 在详细语法中,指示代码块的开始。
class 在详细语法中,指示类的定义开始。
default 指示抽象方法的实现;与抽象方法声明一起使用以创建虚方法。
delegate 用于声明委托。
do 用于循环结构或执行命令式代码。
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 实际上不是关键字。但是,not struct 组合用作泛型参数约束。
null

指示对象不存在。

也可用于泛型参数约束。

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

用作布尔条件中的布尔或运算符。等效于 ||。

也可用于成员约束。

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

用于声明结构类型。

也可用于泛型参数约束。

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

then

用于条件表达式。

也可用于在对象构造后执行副作用。

to 在 for 循环中用于指示范围。
true 用作布尔文字。
try 用于引入可能生成异常的代码块。与 with 或 finally 一起使用。
type 用于声明类、记录、结构、判别联合、枚举类型、度量单位或类型缩写。
upcast 用于转换为继承链中较高的类型。
use 用于代替 let,用于需要调用 Dispose 来释放资源的值。
use! 在异步工作流和其他计算表达式中用于代替 let!,用于需要调用 Dispose 来释放资源的值。
val 在签名中用于指示值,或在类型中用于在有限情况下声明成员。
void 指示 .NET void 类型。在与其他 .NET 语言互操作时使用。
when 用于模式匹配上的布尔条件(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
method 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!
广告
© . All rights reserved.