F#简明教程三:F#语法精要

原创
开发 开发工具
F#基本语法的学习是基于对F#类型系统和类型推断机制的理解的。在本节教程中,我们将学习到F#的变量声明和程序流程结构。

【51CTO独家特稿】在上一节F#教程中,我们对F#的类型系统和类型推断机制有了一个初步的认识。F#的类型推断原理是学习F#的重要基础。本节课程,我们将在F#类型基础上进一步学习F#的一些基本语法。

“let”表达式是F#语法的核心,可以用作定义函数、序列等多种用途。另外,F#使用空格来标记程序块的开始与结束。

定义值

  1. let x = 2 
   

定义函数值 

  1. let f a = a + x 

定义循环函数

  1. open System.IO   
  2. let rec printSubDirFiles dir =   
  3.    let fles = Directory.GetFiles dir  
  4.    let dirs =  Directory.GetDirectories dir   
  5.    printf “%s\n%A\n\n” dir fles  
  6.    Array.iter printSubDirFiles dirs 

此外,F#还提供传统的循环和迭代等流程控制结构,比如if、for、while。但我们需要注意的是,F#中的“if…then”和“if…then…else”与传统的面向对象语言有些不同。在F#中,大多数表达式必须含有一个值,并且控制结构“if…then…else”表达式的两边的值必须是同一类型。注:F#的这种语法约定源自其推断型语言的编译机制,详细请参考上一节教程中关于F#类型推断机制的介绍。

F#中的常用流程控制语句示例

F#常用流程控制语句

与大多数.NET平台上的编程语言相似,F#也提供一些组织代码的机制。事实上,F#提供模块和命名空间两种方式,下面的一些演示将给出C#和VB的命名空间。F#的模块化不只局限与语法范围,还提供模块化的层级标准,例如集合和函数。

F#的基础代码组织:命名空间、类型和模型

  1. namespace MyFSharpProg  
  2. open System.Net  
  3. type Foo () =  
  4.   member x.GetRequest = WebRequest.  
  5. Create  
  6. module Main = begin  
  7.  // values and functions here  
  8. end 

与传统的函数式编程原则相同,多数时候,F#的标识符是不可变的。但F#允许定义和修改使用“mutable”保留字的值,或通过“ref”保留字改变其前面的引用。mutable的值可以通过左箭头操作(“<-”);ref的值可以通过“:=”操作符制指定。我们可以通过“!”获取ref的值。下面来看具体示例:

声明/更新可变值

  1. let mutable x = 0  
  2. x <- x + 1 

 

声明/更新参考值

  1. let x = ref 0  
  2. x := !x + 1 

 

F#小提示:在习惯了C#或Java等编程语言后,刚刚开始F#编程,阅读F#代码感觉就像乱码一样。因为F#为了保有函数式编程的一些优秀特质,不得不引入一些如“<-”、“:=”、“!”等奇怪的符号作为操作符或运算符;另外,F#在代码中需要通过一些推断机制来评判变量的类型,在阅读F#代码时,应对F#的类型系统做到心中有数,所以,多数时候我们看到的是“let”,而不是传统的“int”、“string”、“float”等。希望大家能充分理解F#的类型系统和类型推断机制,这是F#的重要基础,也是走进函数式编程语言的重要一步。

【F#教程回顾】

  1. F#简明教程一:F#与函数式编程概述
  2. F#简明教程二:F#类型系统和类型推断机制
责任编辑:佚名 来源: 51CTO
相关推荐

2010-01-07 10:04:18

F#函数式编程

2010-01-15 08:33:13

F#F#类型推断F#教程

2009-08-13 17:25:21

F#入门

2010-04-07 16:51:59

F#

2009-08-19 09:42:34

F#并行排序算法

2011-06-09 09:52:41

F#

2009-08-13 17:39:48

F#数据类型Discriminat

2009-08-27 09:16:48

F#中DSL原型设计

2012-11-06 10:01:35

ContinuatioF#

2010-03-26 19:22:08

F#代理

2009-12-04 09:16:44

Visual Stud

2009-12-14 09:04:10

F#运算符

2009-11-16 09:05:46

CodeTimer

2009-09-10 14:18:59

Functional F#

2009-12-11 13:59:35

F#

2010-05-13 09:21:44

F#Visual Stud

2012-03-12 12:34:02

JavaF#

2010-03-31 17:00:09

F#

2010-01-04 09:40:46

F#对象

2009-08-18 18:01:20

F#函数式语言
点赞
收藏

51CTO技术栈公众号