codecamp

F#基本语法

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

F# tokens

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

  • 关键词
  • 符号和操作符

F# keywords

下表显示了 keywords的简要说明。 我们将在后续章节讨论这些 keywords的使用。

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

在类型定义和扩展类型,表示成员定义一节的末尾。

在冗长的语法,用于指定的关键字开头开始一个代码块的结束。

exception
用于声明异常类型。
extern
指示已声明的程序元素在另一个二进制文件或程序集中定义。
false
作为一个布尔值。
finally
与尝试一起使用,以引入执行无论是否发生异常的代码块。
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
用于引入可能生成异常的代码块。 与finally一起使用。
type
用于声明一个类,记录,结构,识别联合,枚举类型,计量单位或类型的缩写。
upcast
用于转换为一个类型,是在继承链高。
use
用于转换为在继承链中较高的类型。
use!
用来代替let! 在异步工作流和其他计算表达式的值需要Dispose被调用以释放资源。
val
用于在签名,以指示一个值,或在一个类型声明一个部件,在有限的情况下。
void
指示.NET void类型。与其他.NET语言互操作时使用。
when
用于模式匹配的布尔条件(当guards时),并为通用类型参数引入约束子句。
while
引入了一个循环结构。
with

在模式匹配表达式匹配关键字一起使用。对象表达式,记录复制表达式和类型扩展名也被用来引进的成员定义,并引入异常处理程序。
yield
用于在序列表达以产生用于一序列的值。
yield!
用于在一个计算表达式给定的计算表达式的结果追加到的结果为含有计算表达式的集合。

有些保留关键字从OCaml的语言来 

asrlandlorlsllsrlxormodsig

保留一些其他保留的关键字用于将来扩展F#

atomicbreakcheckedcomponentconstconstraintconstructor
continueeagereventexternalfixedfunctorinclude
methodmixinobjectparallelprocessprotectedpure
sealedtailcalltraitvirtualvolatile  

在F#注释

F#提供了两种类型的注释 -

  • 一个行注释开始于//符号。
  • 多行注释以(*带*号结束)。

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

一般来说,F#程序没有任何明确的入口点。 当编译F#应用程序时,提供给编译器的最后一个文件成为入口点,并且该文件中的所有顶级语句从上到下执行。

一个编写良好的程序应该有一个顶层语句,它将调用程序的主循环。

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

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

当你编译和执行程序,它产生以下输出 -

Hello World!

F#程序结构
F#数据类型
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }