F# 程序设计
文章平均质量分 77
minyskirt
热爱编程,喜欢接触新技术。除了在工作上使用C#、Java语言做开发外,还经常接触Erlang、Ruby以及QT等。平常除了写代码,就是喜欢看看计算机方面的书。
展开
-
F#程序设计-入门(2)
在上篇文章中,我们利用"Hello,World"写出了第一个F#程序。接下来的第二个程序是在控制台中接受两个命令行参数的,并在控制台中打印出来。在C、C++以及C#语言中,所有的程序都有一个共同点,即程序的入口都是以静态的Main方法来执行的,然而,在F#中,可能就要打破这种惯例了,回到前次创建的F#项目中,在Program.fs输入以下代码: 然后在Build菜单中编译整个项原创 2009-12-05 19:41:00 · 1307 阅读 · 1 评论 -
F#程序设计-函数式编程之用函数风格来编程(1)
不变性在F#语言中,不存在像其他语言如 C#中那样有"变量"这一说话,起而代之的是"值"。其原因是,在函数编程中,你定义的任何事物的名称在默认下是不可改变的,也就是说它们的值不能被改变,而我们知道,变量是可以随时被改变的。如果一个函数改变了程序的某种状态,比如写入一个文件或者改变内存中的全局变量,就被称为"副作用"。比如调用printfn函数返回一个unit类型,但是这里有一个副作原创 2009-12-19 09:57:00 · 840 阅读 · 0 评论 -
MapReduce简介以及F#的实现
MapReduce是一个最先由Google提出的分布式编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map"和"Reduce",以及他们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 对于大数据量的计算,通常采用的处理手法就是并行计算,对许多开发人员来说,并行计算还原创 2010-03-04 11:13:00 · 1715 阅读 · 0 评论 -
F#程序设计-函数式编程之函数组合(Function Composition)
一旦你完全掌握了函数运用,就可以开始把他们结合形成更大、更强的函数。这就是所谓的函数组成,也是函数编程的另一个宗旨。在我们介绍函数组成功能之前,先让我们看看利用传统的编程方式,是怎么来解决问题的,下面的示例演示了统计一个指定的路径下的所有文件大小:let sizeOfFolder folder = // Get all files under the path let原创 2009-12-22 13:45:00 · 1190 阅读 · 0 评论 -
F#程序设计-函数式编程之用函数风格来编程(2)
递归函数(Recursive Functions)我们都知道,所谓递归函数就是函数自己调用自己,在函数式编程语言中,这是非常有用的。在F#语言中, 定义一个递归函数,只需要在函数名前面有一个关键字rec来申明,比如下面拿一个经典的列子斐波那契数列来编写一个递归函数:> let rec factorial x =- if x - 1-原创 2009-12-21 13:17:00 · 738 阅读 · 0 评论 -
F#程序设计-函数式编程之惰性加载
在日常软件开发中,大部分编写的代码进行一些计算、求值都是属于"热切"的,意思就是说,只要你执行一个计算,结果就会马上返回给你,不管你现在用不用得着。在F#中,当然也是这样的,然而,就像前面说的,有时你仅仅是预先定义执行的代码,然后等需要用到的时候再执行,获取值,这种情况,在F#中叫做惰性加载。 关于惰性加载,熟悉Hibernate的程序员应都很了解,它其中一个重要的地方,就是惰性加载,惰性原创 2009-12-24 13:48:00 · 1215 阅读 · 0 评论 -
F#程序设计-函数式编程之值的可变性
在.NET中,变量的存放可以放在两个地方堆栈(stack)和堆(heap)中,放在堆栈的变量类型被称为值类型,而放在堆中的被称作为引用类型。值类型就是在堆栈中拥有固定大小的空间,比如int、float类型,引用类型,在堆栈上仅仅存储一个指针,指向堆中内容的地址。尽管虽然指针具有固定的大小,比如4个字节或者8个字节,但是它指向堆中存放的内容可以是更大的。 在F#中,变量的存放机制跟.NET的原创 2009-12-28 10:25:00 · 720 阅读 · 0 评论 -
F#程序设计-面向对象编程之类的定义
F#的面向对象编程与其他的.NET语言总体上没有什么多大的区别,除了语法上有些区别之外。在用户自定义类型当中,类(class)可能定义最频繁的类型吧,F#有两个独特的语法来定义类的构造函数:显式构造与隐式构造。前者更符合F#简单而又简洁的语法,而后者允许更明确的控制类是如何产生的。一、显式构造显式构造是相对于隐式构造来说虽然看来没有那么灵活,但是它提供了最大的控制。原创 2009-12-29 08:59:00 · 747 阅读 · 0 评论 -
F#程序设计-面向对象编程之继承
一、继承基类 在F#中,继承一个基类,需要用到的关键字是inherit。在隐式定义类与显式定义类的继承上,两者之间略有差异。在使用隐式定义类的方式中实现继承时,只需要简单的在申明继承的后面立即加上基类的主要构造函数,并且确保提供基类的主构造函数需要的参数,比如:type BaseClass = val m_field1 : int new(x) = { m_fi原创 2009-12-31 18:04:00 · 853 阅读 · 0 评论 -
F#程序设计-面向对象编程之访问修饰符
封装是类的一大特性,它把抽象的、复杂的事物封装了在内部,调用者无法看到它的内部操作。然而,由于类的调用者能够接触到类暴露出来的任何属性和方法,也能够随意的修改类的属性,改变类的状态,这也导致意外的BUG出现。幸好,F#与.NET其他的语言一样,对于类的属性和方法提供了可访问控制,允许用户可以操作哪些方法或者属性。F#的可访问修饰符跟其它的.NET语言一样,提供了private、public、i原创 2010-01-01 16:46:00 · 777 阅读 · 0 评论 -
F#程序设计-面向对象编程之属性和方法
类通过他们的方法和属性被赋予内涵。方法是一种动作,属于动词,描述类可以做什么或者它能这样做;属性,另一方面,则是形容词,它有助于类的描述。 一、定义属性 属性有三种不同的操作形式:只读、只写、读写。属性的读操作通过get关键字来定义,并且返回属性的值,而写操作,则是通过set关键字来更新属性的值。对于定义一个只读的属性,在语法上只需简单的定义一个方法并且无需参数。而另一种方式是,可以提原创 2009-12-31 08:54:00 · 1011 阅读 · 0 评论 -
F#程序设计-函数式编程之Records
当你想把数据组成一个结构化的格式,而不需要太复杂的语法时,你可以使用F#中的Record类型。Record类型与C语言的Struct类型基本一样,存储一组类型的值,通过字段的值来获取。定义一个Record类型很简单,只需要在大括号内定义系列的名称/类型就可以。要实例化一个Record,只需要提供对应的字段以及值即可,剩下的类型推断系统会根据你的输入来自动判断,比如:> type PersonR原创 2009-12-17 13:31:00 · 740 阅读 · 0 评论 -
F#程序设计-函数式编程之Discriminated Unions
discriminated union是函数式编程中的一个基础类型,要定义discriminated union类型,需要用到type关键字,后面接着的是discriminated union类型的名字,然后用"|"分隔每一个值。在discriminated union类型中的每一个值都被称作为union case。例如一套扑克有四种牌,红桃、方块、梅花、黑桃。我们可以定义一套牌的discrimi原创 2009-12-15 13:38:00 · 930 阅读 · 0 评论 -
F#程序设计-入门(3)
F#互动 在前两篇文章中,我们介绍了两个小程序,一个是用记事本编写的,一个是用IDE编写的,无论用哪种工具,都离不开编译、运行这两个步骤,作为一个刚接触F#语言的人说来,每个实例都需要用这种方法来运行,就显得很麻烦了。有没有别的办法了呢?有。在F#中,提供了一个交互式工具F# Interactive(FSI),通过这个工具,我们就能像是用Ruby、Erlang等开发语言的shell一样,完原创 2009-12-06 11:53:00 · 927 阅读 · 0 评论 -
F#程序设计-F#语言基础之基本类型(1)
在F#程序设计-入门篇中我们利用了两个程序简单的介绍了下F#,在接下来的F#语言基础中,我们将会介绍F#的基本类型、F#的函数编程、F#语言用到的一些集合类型(比如Map、List)以及最后F#程序的模块(Modules)、命名空间(namespace)。 基本类型 一个类型是一个抽象或者概念,并且主要的是它对于执行是安全的。某些类型或许直接代表一个整数,而另一些表现的更原创 2009-12-06 18:20:00 · 815 阅读 · 0 评论 -
F#程序设计-F#语言基础之函数(1)
函数 到目前为止,我们已经介绍完了F#的基本类型,接下来将要介绍的是怎么定义并且使用函数。 定义函数跟定义值在方式上都是一样的,除了函数名后面带的值被称作参数外,下面定义了一个函数square,作用的将x作为参数,并且返回它的平方:> let square x = x * x;;val square : int -> int> square 4;;val it : in原创 2009-12-07 21:33:00 · 845 阅读 · 0 评论 -
F#程序设计-入门(1)
F#是由微软发展的为微软.NET语言提供运行环境的程序设计语言,是函数编程语言(FP,Functional Programming),函数编程语言最重要的基础是Lambda Calculus。它是基于OCaml的,而OCaml是基于ML函数程式语言。有时F# 和 OCaml 的程式是可以交互编译的。F#已经接近成熟,支援Higher-Order Function、Currying、La原创 2009-12-05 13:36:00 · 1268 阅读 · 0 评论 -
F#程序设计-F#语言基础之基本类型(2)
按位运算 整数基本类型在二进制数值中支持操纵按位运算符,运算符通常用于在读取和写入二进制数据文件,下面的表中列出了按位运算的规则:OperatorDescriptionExampleResult&&&Bitwise ‘And’0b1111 &&& 0b00110b0原创 2009-12-07 13:19:00 · 678 阅读 · 0 评论 -
F#程序设计-F#语言基础之函数(2)
3、函数的生命周期 在函数内定义的每个值都有一个特定的范围,也即是它使用的生命周期。默认情况下,定义后的值作用范围在于它所在的模块内,意味着值一旦申明后就可以在任意地方使用。然后,如果指定义在函数内,则它的作用范围仅限于它的函数内。因此,一个函数可以任何函数外面定义的值,但函数外面的其它地方则不能引用一个函数内部定义的值。下面,我们将定义一个在模块范围内的值moduleValue并使用在一个函原创 2009-12-08 08:43:00 · 571 阅读 · 0 评论 -
F#程序设计-F#语言基础之核心类型(1)
前面,我们介绍了.NET平台提供的基本类型,但这些单独的类型不足以建立有效的程序。在F#库包括几个核心类型,让你组织,操作和处理数据,下面列出了一套在你的F#应用程序中需要用到的基本类型:SignatureNameDescriptionExampleunitUnitA unit value原创 2009-12-09 09:08:00 · 642 阅读 · 0 评论 -
F#程序设计-F#语言基础之核心类型(2)
聚合操作尽管list提供了一些方法来把数据组合在一起,但是没有什么特别,真正充满魔力的还是list的聚合操作,这个一个非常强大的功能,对于任何的集合来说,下面将介绍几个聚合函数。 1、List.mapList.map是根据提供的一个函数来创建一个新的list,新list的中每个元素都是根据提供的函数产生的值创建的,它的类型是:(a -> b) -> a l原创 2009-12-10 09:30:00 · 680 阅读 · 0 评论 -
F#程序设计-函数式编程之模式匹配
模式匹配所有程序都需要通过筛选和排序数据;在函数编程中做这些需要用到模式匹配。模式匹配有点像C#和C++中的switch,但是它比switch更强大。模式匹配就是根据输入的数据匹配定义好的一系列规则,如果匹配成功,则执行。该模式匹配表达式然后返回认为是符合规则的结果,因此,在模式匹配的所有规则必须返回相同的类型。如果要执行模式匹配,你可以使用match和with关键字,并在在wit原创 2009-12-14 14:51:00 · 1783 阅读 · 0 评论 -
F#程序设计-F#语言基础之剖析一个F#程序
现在,通过前面的系列介绍,你可能想知道怎么把在FSI交互中的输入的F#代码转换成一个F#程序,但事实上,你在前看看到的每个每个代码片段都是一个全面的项目。大多数其他语言,如C#,需要一个明确的程序入口点,通常称为main方法,然而我们的F#程序迄今尚未定义任何特殊的标记,表明该程序应开始,在F#,单文件应用中代码文件的内容执行顺序是从上到下的,这个跟C语言有点类似,就是如果在一个函数中调用本代原创 2009-12-11 08:59:00 · 703 阅读 · 0 评论 -
F#程序设计-异常处理
每个程序员都不能保证自己写的成员会按照理想状态去运行,就算是高手、大侠,也不能保证他的程序就是完美的。编写软件是一项复杂的事情,正式如此,所以即使是最好的软件也经常伴随着各种各样的问题,有的时候问题是糟糕的代码引起的(比如数组索引的溢出、未能判断空指针),有的时候未考虑用户数据的输入导致的(比如该输入数字时输入了字母),不管如何,任何引发的错误都影响到了程序的正常执行。不过,对于.NET来说,原创 2010-01-02 16:13:00 · 764 阅读 · 0 评论