F#探险之旅(三):命令式编程(下)

控制流程(Control Flow)

在函数式编程(中)一文中,我们初步了解了F#在函数式编程范式下的控制流程,即if, elif, then, else等组成的结构。在命令式编程范式下,F#提供了更多的控制流程支持,包括if,while和for。

在命令式编程范式下的if结构与函数式编程下对应结构的主要差别在于,对于if分支,调用的函数为unit类型(即无返回值),而且并不要求必须使用else分支:

F# Code
if System.DateTime.Now.DayOfWeek = System.DayOfWeek.Thursday then
  print_endline "Thursday play list: lazy afternoon"

这里print_endline函数的类型为string -> int。尽管else分支不是必须的,但如果需要,你也可以加上,不过else分支也必须为unit类型。

F# Code
if System.DateTime.Now.DayOfWeek = System.DayOfWeek.Thursday then
  print_endline "Thursday play list: lazy afternoon"
else
  print_endline "Alt play list: pop music"

至此,不管if结构的分支是否返回值,我们都有办法表示,这样就跟C#的if结构一致了。

在C#中,如果一个分支的语句多于一条,需要使用花括号,而在F#中,分支所包含的语句要通过缩进来表示。

for循环是命令式编程中一种常见的结构。如果你有过C#或VB.NET的经验,那么很容易理解:

F# Code
let sentence = [| "To "; "live "; "is "; "to "; "function." |]
for index = 0 to Array.length sentence - 1 do
  System.Console.Write sentence.[index]

在C#中,for循环是否执行需要看中间的bool表达式的结果,而这里则是看局部值index是否在指定的范围内,而且初始值要小于终止值。F#还提供了另一种for循环结构:

F# Code
let whitePollution = [| "This term refers to "; "pollution caused by ";
  "litter of used plastic bags, "; "polystyrene cups, ";
  "food containers and paper." |]

for index = Array.length whitePollution - 1 downto 0 do
  System.Console.Write whitePollution.[index]

此时index的值将以递减顺序变化。

while循环也较为简单,与C#很相似,直接看个例子吧:

F# Code
// 压洲
let pressureContinent = ref [ "This phrase's pronunciation is ";
  "similar to "Asia" in Chinese, "; "but it means ";
  "a continent of pressure." ]

while (List.nonempty !pressureContinent) do
  System.Console.Write(List.hd !pressureContinent);
  pressureContinent := List.tl !pressureContinent

循环推导(Loops over Comprehensions)

可以使用for循环来枚举一个集合,这种方式与C#中的foreach结构类似。下面的例子对一个字符串数组进行枚举。

F# Code
let words = [| "Red"; "Lorry"; "Yellow"; "Lorry" |]
for word in words do
  print_endline word

时间: 2024-11-03 03:14:42

F#探险之旅(三):命令式编程(下)的相关文章

F#探险之旅(三):命令式编程(上)

在本系列的第二部分(函数式编程上.中.下)中,我们了解了如何使用F#进行纯粹的函数式编程.但是在一些情况下,比如I/O,几乎不能避免改变状态,也就是说会带来side effect.F#并不强求你以无状态的方式编写程序,它提供了可修改(mutable)的标识符来解决这类问题,同时它还提供了其它的程序结构以支持命令式编程.现在就来对这些特性探个究竟. 首先是unit类型,这种类型表示"没有值".然后是F#如何处理可修改的值.最后来看看如何在F#中使用.NET类库,包括如何调用静态方法.创建

F#探险之旅(二):函数式编程(上)

函数式编程范式简介 F#主要支持三种编程范式:函数式编程(Functional Programming,FP).命令式编程(Imperative Programming)和面向对象(Object-Oriented,OO)的编程.回顾它们的历史,FP是最早的一种范式,第一种FP语言是IPL,产生于1955年,大约在Fortran一年之前.第二种FP语言是Lisp,产生于1958,早于Cobol一年.Fortan和Cobol都是命令式编程语言,它们在科学和商业领域的迅速成功使得命令式编程在30多年的

F#探险之旅(四):面向对象编程(上)

面向对象编程概述(OOP) 面向对象编程是当今最流行的编程范式,看看TIOBE 2008年9月的编程语言排行榜就很清楚了: 在这些主流语言中,除了C,都或多或少地提供对OOP的支持,而Java和C#更是纯粹的面向对象编程语言,C还有一个子集--Objective-C.值得一提的是Delphi的强势回归.下图则是各个编程范式的占有率: OOP编程范式是指使用"对象"及"对象"之间的交互来设计应用程序.OOP的基本概念包括类,对象,实例,方法,消息传递,继承,抽象,封装

F#探险之旅(五):透过F#理解函数式编程(上)

关于函数式编程(Functional programming,FP) 函数式编程(FP)是一种编程范式,它计算机的计算过程视为函数运算,避免状态和数据的修改.与命令式编程相比,它更强调函数的运用.λ运算构建了函数式编程的基础.重要的函数式编程语言包括Lisp.Scheme.Erlang.Haskell.ML.OCaml等,微软则在2005年引入了F#. 此外,包括C/C++/C#/Python/Javascript等很多语言也提供了对FP的部分支持.由此我们可以得出一个结论,随着现实问题复杂度的

F#探险之旅(一):选择不同的开发方式

踏上新的旅途 每次旅途都会让人兴奋,都会带来愉快的体验.踏上新的地方,欣赏那些美景,感受那些与自己无关的人和事,身心会得到很大的放松.而回来以后,则会对自己习惯居住的地方产生新的感受,不知你有没有如此的体会呢? 学习F#,也算是这样的旅途吧,毕竟其理念与一直接触的C/C#等很不一样.好奇心遇到未知的事物就会兴奋,就像要踏上新的旅途一样.那为什么叫探险之旅呢? 知识是有时效的资产,咱们微软平台下的开发人员对此应当感受颇深.平台.语言.环境更新地很快,更新意味着旧有知识的贬值,随之带来的是程序员的贬

F#探险之旅(二):函数式编程(下)

模式匹配(Pattern Matching) 模式匹配允许你根据标识符值的不同进行不同的运算.有点像一连串的if...else结构,也像C++和C#中的switch,但是它更为强大和灵活. 看下面Lucas序列的例子,Lucas序列定义跟Fibonacci序列一样,只不过起始值不同: Code let rec luc x = match x with | x when x <= 0 -> failwith "value must be greater than zero"

F#探险之旅(四):面向对象编程(下)

类的继承 在前面(面向对象(中))介绍过的对象表达式中,已经涉及到了类的继承,我们可以覆盖类的成员实现,然后创建新类的实例.这一节里,我们来看看常规的继承机制,熟悉C#的开发人员会感到更亲切. F# Code - 类的继承 #light type Base = class val state : int new() = { state = 0} end type Sub = class inherit Base val otherState : int new() = { otherState

F#探险之旅(五):透过F#理解函数式编程(中)

列表(List)是函数式编程(FP)的基础.事实上,FP的重要代表Lisp的名字即源自"List Processing",它的发明者John McCarthy于1960年发表的论文向我们展示了,在只给定几个简单的操作符和一个表示函数的记号的基础上,如何构造出一个完整的编程语言,他的主要思想之一是用一种简单的数据结构列表来表示代码和数据. 链表(Linked list)是Lisp的主要数据结构之一,并且Lisp的源代码本身也由列表构成.F#中的列表类型表示为链表,它与C#中的数组.泛型L

F#探险之旅(二):函数式编程(中)

操作符(Operator) F#中,可把操作符看作一种函数调用的更为优雅的方式.操作符有两种:前缀(prefix)和中缀(infix),前者接受一个操作数(operand),出现在操作数之前:后者接受两个或多个操作数,出现在头两个操作数之间. F#提供了丰富的操作符集,可用于数字.布尔值.字符串和集合类型.这些操作符数量甚众,限于篇幅,在此不再一一详解.本文将着重介绍如何使用和定义操作符. 类似于C#,F#的操作符也可以重载,也就是说,我们可以将不同的类型用于同一操作符,如"+":但是