上一页 1 ··· 68 69 70 71 72 73 74 75 76 ··· 90 下一页
摘要: 列表(List)是函数式编程(FP)的基础。事实上,FP的重要代表Lisp的名字即源自“ListProcessing”,它的发明者JohnMcCarthy于1960年发表的论文向我们展示了,在只给定几个简单的操作符和一个表示函数的记号的基础上,如何构造出一个完整的编程语言,他的主要思想之一是用一种简单的数据结构列表来表示代码和数据。链表(Linked list)是Lisp的主要数据结构之一,并且Lisp的源代码本身也由列表构成。F#中的列表类型表示为链表,它与C#中的数组、泛型ListT类型有着明显的不同。链表可以用下面的图表示:首先我们来看一下FP中列表的基本操作(其中的代码都由F#实现 阅读全文
posted @ 2011-01-14 13:04 董雨 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 关于函数式编程(Functional programming,FP)函数式编程(FP)是一种编程范式,它计算机的计算过程视为函数运算,避免状态和数据的修改。与命令式编程相比,它更强调函数的运用。λ运算构建了函数式编程的基础。重要的函数式编程语言包括Lisp、Scheme、Erlang、Haskell、ML、OCaml等,微软则在2005年引入了F#。此外,包括C/C++/C#/Python/Javascript等很多语言也提供了对FP的部分支持。由此我们可以得出一个结论,随着现实问题复杂度的增加,单一的编程范式很难满足需要了。我们需要对FP有更多的了解,问题是学习哪种语言呢?作为一个.NET程 阅读全文
posted @ 2011-01-14 13:03 董雨 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 类的继承在前面(面向对象(中))介绍过的对象表达式中,已经涉及到了类的继承,我们可以覆盖类的成员实现,然后创建新类的实例。这一节里,我们来看看常规的继承机制,熟悉C#的开发人员会感到更亲切。F# Code - 类的继承#lighttype Base = class  val state : int  new() = { state = 0}endtype Sub = class  inherit Base  val otherState : int  new() = { otherState = 1 }endlet myObj = new Sub()printfn "myObj.state = 阅读全文
posted @ 2011-01-14 13:01 董雨 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 对象表达式(Object Expressions)F#中的OOP语法很简洁,而对象表达式则正是这种简洁性的核心所在。通过对象表达式,我们可以创建抽象类或接口的轻量级实现,也可以对一个具体的类进行继承。换言之,可以在实现抽象类或接口,或者继承具体类的同时创建新类型的一个实例。下面来看如何对泛型接口IComparer’T应用对象表达式。F# Code#lightopen Systemopen System.Collections.Genericlet revStringComparer =  { new IComparerstring    with      Compare(s1, s2 阅读全文
posted @ 2011-01-14 13:00 董雨 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 面向对象编程概述(OOP)面向对象编程是当今最流行的编程范式,看看TIOBE 2008年9月的编程语言排行榜就很清楚了:在这些主流语言中,除了C,都或多或少地提供对OOP的支持,而Java和C#更是纯粹的面向对象编程语言,C还有一个子集——Objective-C。值得一提的是Delphi的强势回归。下图则是各个编程范式的占有率:OOP编程范式是指使用“对象”及“对象”之间的交互来设计应用程序。OOP的基本概念包括类,对象,实例,方法,消息传递,继承,抽象,封装,多态和解耦(Decoupling)等。“一切皆是对象”这句话曾盛极一时,它也衍生出了像设计模式这样的重要理念。关于面向对象编程,需要很 阅读全文
posted @ 2011-01-14 12:57 董雨 阅读(398) 评论(0) 推荐(0) 编辑
摘要: 控制流程(Control Flow)在函数式编程(中)一文中,我们初步了解了F#在函数式编程范式下的控制流程,即if, elif, then, else等组成的结构。在命令式编程范式下,F#提供了更多的控制流程支持,包括if,while和for。在命令式编程范式下的if结构与函数式编程下对应结构的主要差别在于,对于if分支,调用的函数为unit类型(即无返回值),而且并不要求必须使用else分支:F# Codeif System.DateTime.Now.DayOfWeek = System.DayOfWeek.Thursday then  print_endline "Thursday pl 阅读全文
posted @ 2011-01-14 12:56 董雨 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 在本系列的第二部分(函数式编程上、中、下)中,我们了解了如何使用F#进行纯粹的函数式编程。但是在一些情况下,比如I/O,几乎不能避免改变状态,也就是说会带来sideeffect。F#并不强求你以无状态的方式编写程序,它提供了可修改(mutable)的标识符来解决这类问题,同时它还提供了其它的程序结构以支持命令式编程。现在就来对这些特性探个究竟。首先是unit类型,这种类型表示“没有值”。然后是F#如何处理可修改的值。最后来看看如何在F#中使用.NET类库,包括如何调用静态方法、创建对象并使用其成员、使用类的索引器和事件以及F#中的|操作符。unit类型没有参数和返回值的函数的类型为unit, 阅读全文
posted @ 2011-01-14 12:55 董雨 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 模式匹配(Pattern Matching)模式匹配允许你根据标识符值的不同进行不同的运算。有点像一连串的if...else结构,也像C++和C#中的switch,但是它更为强大和灵活。看下面Lucas序列的例子,Lucas序列定义跟Fibonacci序列一样,只不过起始值不同:Codelet rec luc x =  match x with  | x when x = 0 - failwith "value must be greater than zero"  | 1 - 1  | 2 - 3  | x - luc(x - 1) + luc(x - 2)printfn "(lu 阅读全文
posted @ 2011-01-14 12:54 董雨 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 操作符(Operator)F#中,可把操作符看作一种函数调用的更为优雅的方式。操作符有两种:前缀(prefix)和中缀(infix),前者接受一个操作数(operand),出现在操作数之前;后者接受两个或多个操作数,出现在头两个操作数之间。F#提供了丰富的操作符集,可用于数字、布尔值、字符串和集合类型。这些操作符数量甚众,限于篇幅,在此不再一一详解。本文将着重介绍如何使用和定义操作符。类似于C#,F#的操作符也可以重载,也就是说,我们可以将不同的类型用于同一操作符,如“+”;但是与C#不同的是,各个操作数必须为相同的类型。F#的操作符重载规则与C#类似,因此任何BCL或者使用C#编写的.NET 阅读全文
posted @ 2011-01-14 12:52 董雨 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 函数式编程范式简介F#主要支持三种编程范式:函数式编程(Functional Programming,FP)、命令式编程(ImperativeProgramming)和面向对象(Object-Oriented,OO)的编程。回顾它们的历史,FP是最早的一种范式,第一种FP语言是IPL,产生于1955年,大约在Fortran一年之前。第二种FP语言是Lisp,产生于1958,早于Cobol一年。Fortan和Cobol都是命令式编程语言,它们在科学和商业领域的迅速成功使得命令式编程在30多年的时间里独领风骚。而产生于1970年代的面向对象编程则不断成熟,至今已是最流行的编程范式。有道是“江山代有 阅读全文
posted @ 2011-01-14 12:50 董雨 阅读(291) 评论(0) 推荐(0) 编辑
上一页 1 ··· 68 69 70 71 72 73 74 75 76 ··· 90 下一页