随笔分类 - F#
摘要:我们身在何处?前面写过的随笔主要关注的是F#与FP的基本概念,对UI涉及很少。我们知道,没有UI就没法与用户进行交互,所以写两篇随笔来了解一下这方面的内容。本文主要关注的是如何使用F#开发WinForm应用程序,后面还会介绍如何使用F#开发ASP.NET应用程序。不过说真的,我对WinForm开发了解不多,所以如果有不妥之处,欢迎您的指正。WinForm中的基础类型是System.Windows.Forms.Form类,通过它我们可以创建一个窗体,在窗体上我们可以根据需要进行绘制。绘制的时候我们可以选择使用.NET提供的API手工“画”出一些图形,比如像素着色、直线、圆等等,也可以使用.NET
阅读全文
摘要:单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常情况下,一个单元测试(用例)用于判断某个特定条件(或场景)下特定函数的行为。如果想对单元测试的好处有更多的了解,可以看一下单元测试实战。在.NET社区内,NUnit无疑是最经典的单元测试工具,要了解它的用法,建议看一下园子里的一篇很棒的文章NUnit详细使用方法。本文对此不再赘述。另外MbUnit作为后起之秀,也很值得一试。在F#中, LOP(Language-OrientedProgramming)是它的一个亮点,而FsUnit则是LOP的一个很好的实践。FsUnit使用F#开发,用它编写的测试用例会接
阅读全文
摘要:列表(List)是函数式编程(FP)的基础。事实上,FP的重要代表Lisp的名字即源自“ListProcessing”,它的发明者JohnMcCarthy于1960年发表的论文向我们展示了,在只给定几个简单的操作符和一个表示函数的记号的基础上,如何构造出一个完整的编程语言,他的主要思想之一是用一种简单的数据结构列表来表示代码和数据。链表(Linked list)是Lisp的主要数据结构之一,并且Lisp的源代码本身也由列表构成。F#中的列表类型表示为链表,它与C#中的数组、泛型ListT类型有着明显的不同。链表可以用下面的图表示:首先我们来看一下FP中列表的基本操作(其中的代码都由F#实现
阅读全文
摘要:前言是的,我们已经学习了如何在F#中使用各种范式(函数式、命令式、面向对象)进行编程。但是目前还仅限于在单个模块内编写,要知道,不管是采用哪种语言或者范式编程,如果项目规模大了,都不适合把所有代码放在单个模块内。在常规的.NET项目中(比如C#+ASP.NET),我们往往会选择使用Solution的概念作为整个(独立)问题域的解决方案,Solution以下则是Project、File。这些概念在物理上往往表现为程序集(类库或可执行程序)、类文件等,如果项目和文件数量较多,就该好好考虑如何在组织它们。下面从这三个层次上分别来讨论一下。Solution层次这里主要考虑的是Project之间的相互关
阅读全文
摘要:关于函数式编程(Functional programming,FP)函数式编程(FP)是一种编程范式,它计算机的计算过程视为函数运算,避免状态和数据的修改。与命令式编程相比,它更强调函数的运用。λ运算构建了函数式编程的基础。重要的函数式编程语言包括Lisp、Scheme、Erlang、Haskell、ML、OCaml等,微软则在2005年引入了F#。此外,包括C/C++/C#/Python/Javascript等很多语言也提供了对FP的部分支持。由此我们可以得出一个结论,随着现实问题复杂度的增加,单一的编程范式很难满足需要了。我们需要对FP有更多的了解,问题是学习哪种语言呢?作为一个.NET程
阅读全文
摘要:类的继承在前面(面向对象(中))介绍过的对象表达式中,已经涉及到了类的继承,我们可以覆盖类的成员实现,然后创建新类的实例。这一节里,我们来看看常规的继承机制,熟悉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 =
阅读全文
摘要:对象表达式(Object Expressions)F#中的OOP语法很简洁,而对象表达式则正是这种简洁性的核心所在。通过对象表达式,我们可以创建抽象类或接口的轻量级实现,也可以对一个具体的类进行继承。换言之,可以在实现抽象类或接口,或者继承具体类的同时创建新类型的一个实例。下面来看如何对泛型接口IComparer’T应用对象表达式。F# Code#lightopen Systemopen System.Collections.Genericlet revStringComparer = { new IComparerstring with Compare(s1, s2
阅读全文
摘要:面向对象编程概述(OOP)面向对象编程是当今最流行的编程范式,看看TIOBE 2008年9月的编程语言排行榜就很清楚了:在这些主流语言中,除了C,都或多或少地提供对OOP的支持,而Java和C#更是纯粹的面向对象编程语言,C还有一个子集——Objective-C。值得一提的是Delphi的强势回归。下图则是各个编程范式的占有率:OOP编程范式是指使用“对象”及“对象”之间的交互来设计应用程序。OOP的基本概念包括类,对象,实例,方法,消息传递,继承,抽象,封装,多态和解耦(Decoupling)等。“一切皆是对象”这句话曾盛极一时,它也衍生出了像设计模式这样的重要理念。关于面向对象编程,需要很
阅读全文
摘要:控制流程(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
阅读全文
摘要:在本系列的第二部分(函数式编程上、中、下)中,我们了解了如何使用F#进行纯粹的函数式编程。但是在一些情况下,比如I/O,几乎不能避免改变状态,也就是说会带来sideeffect。F#并不强求你以无状态的方式编写程序,它提供了可修改(mutable)的标识符来解决这类问题,同时它还提供了其它的程序结构以支持命令式编程。现在就来对这些特性探个究竟。首先是unit类型,这种类型表示“没有值”。然后是F#如何处理可修改的值。最后来看看如何在F#中使用.NET类库,包括如何调用静态方法、创建对象并使用其成员、使用类的索引器和事件以及F#中的|操作符。unit类型没有参数和返回值的函数的类型为unit,
阅读全文
摘要:模式匹配(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
阅读全文
摘要:操作符(Operator)F#中,可把操作符看作一种函数调用的更为优雅的方式。操作符有两种:前缀(prefix)和中缀(infix),前者接受一个操作数(operand),出现在操作数之前;后者接受两个或多个操作数,出现在头两个操作数之间。F#提供了丰富的操作符集,可用于数字、布尔值、字符串和集合类型。这些操作符数量甚众,限于篇幅,在此不再一一详解。本文将着重介绍如何使用和定义操作符。类似于C#,F#的操作符也可以重载,也就是说,我们可以将不同的类型用于同一操作符,如“+”;但是与C#不同的是,各个操作数必须为相同的类型。F#的操作符重载规则与C#类似,因此任何BCL或者使用C#编写的.NET
阅读全文
摘要:函数式编程范式简介F#主要支持三种编程范式:函数式编程(Functional Programming,FP)、命令式编程(ImperativeProgramming)和面向对象(Object-Oriented,OO)的编程。回顾它们的历史,FP是最早的一种范式,第一种FP语言是IPL,产生于1955年,大约在Fortran一年之前。第二种FP语言是Lisp,产生于1958,早于Cobol一年。Fortan和Cobol都是命令式编程语言,它们在科学和商业领域的迅速成功使得命令式编程在30多年的时间里独领风骚。而产生于1970年代的面向对象编程则不断成熟,至今已是最流行的编程范式。有道是“江山代有
阅读全文
摘要:http://www.bianceng.cn/Programming/F_Sharp/index3.htm踏上新的旅途 每次旅途都会让人兴奋,都会带来愉快的体验。踏上新的地方,欣赏那些美景,感受那些与自己无关的人和事,身心会得到很大的放松。而回来以后,则会对自己习惯居住的地方产生新的感受,不知你有没有如此的体会呢?学习F#,也算是这样的旅途吧,毕竟其理念与一直接触的C/C#等很不一样。好奇心遇到未知的事物就会兴奋,就像要踏上新的旅途一样。那为什么叫探险之旅呢?知识是有时效的资产,咱们微软平台下的开发人员对此应当感受颇深。平台、语言、环境更新地很快,更新意味着旧有知识的贬值,随之带来的是程序员的
阅读全文
摘要:在上一篇教程《F#与函数式编程概述》中我们了解到F#和函数式编程的一些特点,更多关于F#语言和函数式编程的介绍可以参考51CTO之前对微软MVP赵颉老师的专访《TechED09视频专访:F#与函数式编程语言》。本节教程我们将学习到F#的一些基础原理,在开始之前,让我们先温习一下我们的Hello World代码:#lightSystem.Console.WriteLine(“Thisis one hello”)printfn “Thisis another hello”F#是函数式和面向对象的混合体。它有时候会看起来与C#或Visual Basic惊人的相似,但却又完全陌生。F#程序以一系列的表
阅读全文
摘要:F#是微软.NET开发平台的一门编程语言,其最大的特点是对函数式编程(FP,FunctionalProgramming)的引入;F#对面向对象(OOP)编程的支持也很出色,使用F#语言,开发人员可以自由选择函数式编程或面向对象编程来实现他们的项目。此外,F#还可以与.NET平台上C#、VB等其他编程语言紧密结合。CPU多核心化和云计算的背景下,函数式编程可以很好的解决多并发运算的问题(在处理并发问题方面,面向对象编程存在一定程度的固有缺陷,比如类和实例化过程中产生的一些副作用,详细请参考51CTO.com对另一门函数式编程语言Erlang的视频访谈《因并发而生 因云计算而热:Erlang专家访
阅读全文
摘要:一、简介 F#是一个基于.NET框架的多模式编程语言,Visual Studio 2010中对此语言提供了内置支持。F#支持函数式编程、面向对象编程和命令式编程。 以下各节描述的是在Visual F#的第一个正式版本中所提供的一些特征。作 为 Microsoft®.NET Framework 家族的新成员,F# 提供类型安全、性能以及类似脚本语言的工作能力,所有这些都是 .NET环境的一部分。此函数式语言由 Microsoft 研究院的 Don Syme 发明,作为 CLR 的 OCaml 语法兼容变体,但 F#已经迅速地从科研转为投入实际应用。随着函数式编程的概念通过 .NET 泛型和
阅读全文
摘要:缘起 当你看到这篇文章的标题时,你有什么感觉?是不是很想脱口而出:"到底搞什么飞机啊,我C#还没来得及用好,现在又搞个F#,还让不让人活啊?"《程序员修炼之道》曾经建议我们"learn at leastone new language every year",但Gustavo Duarte却对这种建议提出质疑,并宣称"learning new programming languages is often a waste oftime for professionalprogrammers"。面对这种争论,你可能会显示出某种理性:除非我有需要(学习新的语言),否则我认为够用就可以了。那么,你什么
阅读全文
摘要:在VS2010里已经集成了F#,F#本身是函数型的编程语言,在数学运算方面具备天生的优越性,下面说明如何在C#中调用F#,并简单的从纯语法的角度来比较一下性能。1. 建立一个F#库2. 在F#的原文件中添加一个Module(一定要添加哦,不然在C#中是无法调用的!),然后在这个Module中添加一个Swap函数。代码如下:module FSModulelet Swap(a,b)=(b,a)看习惯了C风格代码的程序员,再来看这段F#代码可能会感觉语法有怪异,但是真的挺简洁的。3. 建立一个C#的应用程序,并添加这个F#库的引用4. 在C#的应用程序里添加一个C风格版本的Swap方法,代码如下:p
阅读全文

浙公网安备 33010602011771号