F# 20分钟快速上手(一)

Allen Lee的《从C# 3.0到F#》一文开始,感觉园子里F#正在升温。Chris Smith写了一个F#的小系列,这里翻译出来与大家分享。

第一篇,从零开始编写我们的第一个F#程序。

什么是F#,我为何要学它?

F#是一种.NET平台上的函数式编程语言。就像C#和VB.NET,F#可以利用.NET的核心类库,如WPFWCFVSTO等等,通过F#您甚至可以使用XNA编写XBox游戏。

仅仅如此并不意味着您应该去学习它。那为何要使用F#呢?作为一种函数式编程语言,F#使得某些领域的编程要比命令式编程(如使用C#)更为容易。并行编程(Parallel Programming)和面向语言编程(Language-Oriented Programming)是其中的两个领域。

如果您曾经编写过.NET应用程序,并感觉自己在努力使用手头的语言表达自己的想法,也许F#就是您在寻找的。

上路

首先得下载(F#的最新版本1.9.4.19)和安装。安装程序会在VS2005和VS2008中安装F#的项目系统(项目模板和项模板)。先来创建一个新的F#项目。

createProject

然后添加一个新的F#源文件。默认条件下,新建的源文件包含了很多“教学”代码,全部删除,然后输入下面的代码:

#light

let square x 
= x * x
let numbers 
= [1 .. 10]
let squares 
= List.map square numbers
printfn 
"N^2 = %A" squares

open System
Console.ReadKey(
true)

按下F5运行程序,您会看到:

squareResults

这些并没有太多让人兴奋的。我们来逐行的分析下代码,看看到底有什么不同之处,在此之前先介绍下VFSI。

Visual Studio中的F#交互(Interactive)

F#交互控制台(F# Interactive Console, FSI)采用的是“REPL loop”模式,即Read-Evaluate-Print-Loop。也就是输入一段代码,编译并执行,然后输出结果。通过它您可以快速地开发和测试程序。要在VS中启用FSI,打开Add-in Manager窗口。

addInManager

选中“F# Inactive for Visual Studio”。然后,选中程序的前两行代码:

firstTwoLines

接着按下Alt+Enter(实际上,如果FSI还么有打开,需要按两次Alt+Enter)。这时会看到出现了一个工具窗口:

fsiWindow

我们刚才做的事情是将代码片段直接发送给FSI会话,FSI将结果输出。结果是函数“square”的定义,它接受int类型参数,返回类型也是int。

接下来在FSI窗口输入“List.map square [1 .. 2 .. 10];;”。“;;”是告诉FSI停止阅读程序,立即进行求值。

> List.map square [1 .. 2 .. 10];;
val it : 
int list = [19254981]

现在我们可以方便地通过FSI来学习F#了,马上来看看我们的程序究竟做了什么吧。不过仍建议您在VS源代码编辑器中输入代码,使用“Select(原文是Highlight,感觉Select更贴切) + Alt + Enter”将代码片段发送至FSI。

语言基础

#light(OCaml兼容)

F#源自OCaml,具有交互编译OCaml的能力,也就是可以不经修改即可编译简单的OCaml程序。这种能力也带来了令人讨厌的语法。#light(发音为hash-light)是一个编译器指令,可以简化F#的语法。

强烈建议您保持使用#light,您会发现,在大多数F#代码片段中要么会声明它,要么是假定已经声明了它。

let square x = x * x(类型推演)

 

这行代码定义了一个函数:square,它会求得数字x的平方。考虑一下C#中等价的代码:

public static int square(int x)
{
    
return x * x;
}

在C#中,您需要制定参数和返回值的类型信息,而F#则帮您搞定了。这种行为称为类型推演(Type Inference)

从函数的签名,F#可以知道“square”函数接受一个参数“x”,并且函数返回“x * x”(在函数体内的最后一次求值将作为返回值,因此无须return关键字)。因为很多基元类型都支持*操作,比如byte,uint64,double等,F#默认会使用int类型,有符号的32位整数。

现在考虑下面的代码,它为其中的一个参数提供了“类型注解(type annotation)”,告诉编译器期望的类型。因为x标为“string”,“+”操作只定义在两个string间,因此y也必须为string类型,返回值是两个字符串拼接的结果。

> let concat (x : string) y = x + y;;
val concat : 
string -> string -> string

> concat "Hello, " "World!";;
val it : 
string = "Hello, World!"

后面我们将讨论类型推演的更多高级主题,现在您只要享受F#编译器的智能带来的方便就好了。 

 

let numbers = [1 .. 10](F# lists)

这行代码声明了一个列表(list),其元素是从1至10。如果您用的是[|1 .. 10|],F#会创建一个.NET的整型数组(array)。而在F#中,列表是一个不可变的链表(linked list),这也是函数式编程的基础。试着将这些代码输入到FSI中(记住添加“;;”):

// Define a list 
let vowels = ['e''i''o''u'

// Attach item to front (cons)
let cons = 'a' :: vowels 

// Concat two lists
let sometimes = vowels @ ['y']

我将在本系列的第二篇中更深入地介绍列表。

let squares = List.map square numbers

现在我们有了一个整型列表(numbers)和一个函数(square),我们希望创建一个新的列表,它的每一项是对numbers的每一项进行square运算后的结果。

幸运的是,List.map可以做到。考虑下面的例子:

> List.map (fun x -> x % 2 = 0) [1 .. 10];;
val it : 
bool list
= [falsetruefalsetruefalsetruefalsetruefalsetrue]

代码(fun x -> x % 2 = 0)定义了一个匿名函数,称为lamdba表达式,接受一个参数x,返回值为表达式“x % 2 = 0”的结果,也就是判断x是否为偶数。

注意我们刚才做的——将一个函数作为参数传递给另一个函数。在C#中这个并不容易。但在F#可以很清楚地表达出来,而且代码很简洁。将函数像值一样传递被称为“一等函数(first order functions)”,也是函数式编程的基础。

printfn "N^2 = %A" squares

printf是打印文本到控制台窗口的一种简单而又类型安全的方式。要更好地了解printf,考虑下面的例子,它打印一个整数、浮点数和字符串。

> printfn "%d * %f = %s" 5 0.75 ((5.0 * 0.75).ToString());;
5 * 0.750000 = 3.75
val it : unit 
= ()

%d,%f,%s分别是int、float、string的占位符。%A则可用于打印任何值。

Console.ReadKey(true) (.NET互操作)

我们程序的最后一行只是简单地调用了System.Console.ReadKey方法,这样可以让程序在关闭其暂停。因为F#建立在.NET的基础上,您可以在F#中调用任何.NET类库——从正则表达式到WinForms。代码“open System”用于打开命名空间,类似于C#中的using。

现在我们已经有了F#的基础知识,可以继续学习更有趣的基础类型和F#概念了,希望您关注第二篇文章!

原文链接:http://blogs.msdn.com/chrsmith/archive/2008/05/02/f-in-20-minutes-part-i.aspx

作者:Anders Cui
出处:http://anderslly.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2008-08-03 14:50 Anders Cui 阅读(3207) 评论(30)  编辑 收藏 网摘 所属分类: 40-Coding For Fun63-翻译42-F#

  回复  引用  查看    
#1楼2008-08-03 14:58 | Kevin Zhang      
虽然对F#一点都不了解了,不过还是谢谢楼主提供这篇翻译的文章。继续关注,谢谢崔哥!
  回复  引用  查看    
#2楼[楼主]2008-08-03 15:12 | Anders Cui      
@Kevin Zhang
这篇文章就是从零开始的啊,希望能有所帮助 :)

  回复  引用  查看    
#3楼[楼主]2008-08-03 15:14 | Anders Cui      
@dudu
提个建议
能否在后台添加代码里添加F#语言?
还有就是最近感觉在Live Writer里面写好的东西发布后都变形了,没原来方便了。

  回复  引用    
#4楼2008-08-03 15:26 | f#中文站[未注册用户]
中文内容请访问 http://www.f-sharp.cn/
  回复  引用  查看    
#5楼2008-08-03 15:31 | 谦虚的天下      
不错啊!
  回复  引用  查看    
#6楼2008-08-03 15:42 | dudu      
@Anders Cui
F#语言的支持我们会尽快加上。
Live Writer的问题我们会检查一下。

  回复  引用  查看    
#7楼2008-08-03 15:55 | lexus      
加上@dudu就能让dudu看到留言吗?,还是因为正好dudu浏览了这篇文章?
  回复  引用  查看    
#8楼2008-08-03 15:57 | Jeffrey Zhao      
安德斯崔现在是翻译达人了阿!
  回复  引用  查看    
#9楼[楼主]2008-08-03 16:31 | Anders Cui      
@dudu
谢谢老大 :-)

  回复  引用  查看    
#10楼[楼主]2008-08-03 16:31 | Anders Cui      
@lexus
应当是dudu正好看到的吧

  回复  引用  查看    
#11楼[楼主]2008-08-03 16:32 | Anders Cui      
@Jeffrey Zhao
达人不敢当,自己没什么写的,只能翻译点东西聊以自慰了

  回复  引用    
#12楼2008-08-03 16:53 | 呵呵呵[未注册用户]
不知道微软又在抄袭什么
样子挺像 python的,有没有一点新的思想啊?

  回复  引用  查看    
#13楼2008-08-03 17:05 | hxm      
典型的 看到python ruby 红了 微软又开始抄袭了
上次是抄袭java 下次erlang红了 又开始抄多核语言了唉。。。

silverlight抄袭flex

  回复  引用  查看    
#14楼[楼主]2008-08-03 17:26 | Anders Cui      
@呵呵呵
* interactive scripting like Python,
* the foundations for an interactive data visualization environment,
* the strong type inference and safety of ML,
* a cross-compiling compatible core shared with the popular OCaml language,
* a performance profile like that of C#,
* easy access to the entire range of powerful .NET libraries and database tools,
* a foundational simplicity with similar roots to Scheme,
* the option of a top-rate Visual Studio integration,
* the experience of a first-class team of language researchers with a track record of delivering high-quality implementations,
* the speed of native code execution on the concurrent, portable, and distributed .NET Framework.

  回复  引用  查看    
#15楼2008-08-03 17:27 | 生鱼片      
又要学新东西了
  回复  引用  查看    
#16楼[楼主]2008-08-03 17:27 | Anders Cui      
@hxm
抄袭是一个角度
另一个角度则可以看作学习
Java也在像.NET学习啊

  回复  引用    
#17楼2008-08-03 17:29 | 三国斌[未注册用户]
支持下,终于有人关注F#了
  回复  引用  查看    
#18楼2008-08-03 18:21 | Allen Lee      
老崔也出手了,支持一下,呵呵~~~
  回复  引用  查看    
#19楼2008-08-03 18:40 | 怪怪      
@hxm
老兄, 我真是服了你了, F#是从OCAML发展出来的, OCAML则是ML的一个变形。

至于号称有一些类似于Python、Ruby的特性,只是宣传上的噱头,实际上这些特性对一个类似的语言是天然的; 更何况F#是基于类型推导的静态语言, 跟动态语言有很大不同。

真正愿意虚心学习多了解一点的, 都不会说出你们这么外行的话。心里有成见, 是当不了程序员的。

  回复  引用  查看    
#20楼[楼主]2008-08-03 18:57 | Anders Cui      
@Allen Lee
看你出手了,忍不住了,呵呵

  回复  引用    
#21楼2008-08-03 18:57 | chaowei126[未注册用户]
支持 @hxm 的说法
支持 @hxm的说法
支持 @hxm的说法




  回复  引用  查看    
#22楼[楼主]2008-08-03 19:00 | Anders Cui      
@hxm
@怪怪
F#和Python一样都支持函数式编程、命令式编程、OO三种编程范式
但这三种范式显然并不是因为这两种语言才存在的,就像怪怪所说,这些类似是天然的。
还有F#在.NET平台下“根正苗红”,未来看起来不错;但IronPython呢?

  回复  引用    
#23楼2008-08-03 22:13 | gakaki[未注册用户]
行 我的确没有深入 没错 我确实没仔细学过smaltalk lisp之类的语言
不知道D语言之类的语言 不知道函数式

但是你看看微软总是没事放新的语言 可是它在开源界呢
你看看 开源的 都是 PHP RUBY PYTHON

微软 每次都想靠语言取胜。。。

真正愿意虚心学习多了解一点的, 都不会说出你们这么外行的话。心里有成见, 是当不了程序员的。

说实话 linux大师都炮轰过C++呢 你怎么说。。。
不是须不虚心的问题 学ria的都有silverlight流和adobe流了
有人愿意用ORM 有人愿意用sql 那其实就是个喜好问题
第一眼喜欢了就是喜欢了。。。有人喜欢javaeye有人喜欢cnblogs有人
有人都喜欢。。。。

俺们这些看了ruby的是真的知道rails的威力了 你看微软还不是MVC来着。。。。
至于这个F# 肯定也是会看看的 。。但是照样炮轰微软 开源的步伐太慢了

  回复  引用  查看    
#24楼2008-08-03 23:57 | 怪怪      
@gakaki
你当Linus连点面向对象都搞不懂就敢张嘴胡喷哪? 人家炮轰的有的放矢, 这正是专业人士和各种Fans的不同之处。

如果你只是觉得微软开源步伐慢, 那你就轰这一点就完了, 何必恨乌及屋,在不懂的事情上闹笑话呢?这不是喜欢不喜欢的问题, 而是理性不理性的问题。

能够弄懂并承认不喜欢的东西,也勇于批判喜欢的东西,不是有益的态度吗?都像超女Fans那样,计算机后面也不用加上科学二字了。

另外, 即使是ORM和SQL这种选择, 如果工程师的判断标准就是顺眼与否, 我不知道这个工程师的老板会怎么想?

  回复  引用  查看    
#25楼2008-08-04 08:38 | 追求卓越      
@gakaki
真正愿意虚心学习多了解一点的, 都不会说出你们这么外行的话。心里有成见, 是当不了程序员的。

你说的这句话,自己要认真看看了。

  回复  引用  查看    
#26楼[楼主]2008-08-04 09:28 | Anders Cui      
...
  回复  引用  查看    
#27楼2008-08-04 21:27 | fox23      
@gakaki
语言只是工具而已,不要由此牵扯到门户观念.

  回复  引用  查看    
#28楼2008-12-18 16:02 | U2U      
好文章,谢谢
  回复  引用  查看    
#29楼2008-12-27 08:47 | 蛙蛙池塘      
我还是先学windows基础吧,语言以后再学,这玩意儿变化太快,就win32 api、算法和设计模式变的慢。
  回复  引用  查看    
#30楼[楼主]2008-12-27 11:36 | Anders Cui      
@蛙蛙池塘
是啊,说的对。用老赵的话说就是,“大学里学的东西才是最重要的”

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1259218




相关文章:

相关链接: