Spiga

F#系列随笔索引

2008-10-08 00:18 by Anders Cui, 4547 visits, 收藏, 编辑

循着我的Google笔记本,我看到第一条与F#相关的笔记发生在4月7日,到今天刚好6个月整。

为何要学习F#?这是个首当其冲的问题,跟当初“Java还是C#”这样的问题不同,现在是在学习一门新语言。《程序员修炼之道》的一句话“每年至少学习一种新语言”让我蠢蠢欲动,除了F#,去年还看过一些Python,甚至写过一些小程序。但最终选择了F#,也许有一篇文章起到了很大的作用,如果你没有用过函数式编程语言,可以看看这篇文章;还有可能是因为这一篇《谁在用F#》(后来知道这其实是《Foundations of F#》第一章里面的部分内容)。尤其是后面这篇文章,对F#的描述真的能雷到人。

最近我发现,我周围的程序员在技术的选择上日趋理性(日渐衰老?...),尤其是一致认为“语言并不重要,重要的是...”,省略掉的内容也许不尽相同,但语言肯定是不重要的了。

真的是这样吗?我倒不这么觉得。但在这样的背景下,如果一门语言的广告不能雷到人,还面对C#这样成熟的语言,就真的很难引起人们的兴趣

幸运的是,我被雷到了。真正开始学习F#是在7月份之后(因为4、5、6这3个月经历了工作的变动)。初学F#肯定会遇到一些令人困惑的地方,比如副作用(side effect),柯里化,函数是一等公民云云,那时经常是从一个概念跳到另一个概念,不过看得多了,就慢慢熟悉了。

我希望能有一个F#教程,它能在一些简单的例子中帮我们拨开乌云,《Foundations of F#》这本书不错,不过有些繁琐、冗长。我把书中的内容整理了一下,也会把在《Expert F#》或者网上其它文章的内容加进来,另外我还喜欢把自己想到的F#与C#的异同点给写出来。这些就是我的《F#探险之旅》,本来我还想起名为《无废话F#》或《Essential F#》,感觉都不如探险来的贴切。

Chris Smith的F#快速上手(翻译)
F# 20分钟快速上手(一)
F# 20分钟快速上手(二)

《F#探险之旅》

F#探险之旅(一):选择不同的开发方式
F#探险之旅(二):函数式编程(上)
F#探险之旅(二):函数式编程(中)
F#探险之旅(二):函数式编程(下)
F#探险之旅(三):命令式编程(上)
F#探险之旅(三):命令式编程(下)
F#探险之旅(四):面向对象编程(上)

F#探险之旅(四):面向对象编程(中)
F#探险之旅(四):面向对象编程(下)
F#探险之旅(五):透过F#理解函数式编程(上)(FP的基本特性)
F#探险之旅(五):透过F#理解函数式编程(中)(FP的列表操作)
F#探险之旅(六):F#代码的组织(整理前面介绍过的三种范式,为实战做好准备)
F#探险之旅(七):在F#中进行单元测试(NUnit & FsUnit,后者也是LOP的一个好例子)
F#中的事件(

F#与LOP(Language-Oriented Programming)
理解F#中的模式匹配与活动模式

F# 应用
使用F#绘制Mandelbrot集合
Eratosthenes筛法的F#实现
F#中有趣的计量单位

其它
从这里开始学习F#
推荐F#最近的一些资源

在目前计划中的:
F#探险之旅(五):透过F#理解函数式编程(下):介绍FP中的Continuation和Monad特性;
F#中的工作流;
F#中的Quotation及其应用;
F#与C#代码的互操作;
F#与UI:主要是介绍在Windows应用和ASP.NET应用开发中使用F#;
F#实例:做一个F#实战的例子(综合应用前面讲过的内容);

《探险之旅》的主要目的在于作出一份简单的帮助文档,能帮助有C#或VB.NET编程经验的程序员快速上手,希望能不断接近这个目标。

注意
: 目前为止,这个系列文章中的代码均在F# 1.9.4.17版本下编写,在F# CTP 1.9.6.0版本下可能不能通过编译。由于本人的电脑的服役时间已经超过了5年,所以我也不打算让它运行VS2008,但VS 2008 Express版上又不能集成F# CTP,我现在使用的环境仍然是VS2005下的F#1.9.4,但我会在不远的将来买新电脑,到时也会转移到更新的F#版本,不过我相信这对我F#的学 习不会有大影响。

2008.11.17 更新:从现在开始将主要使用F# CTP 1.9.6.0版本 :-}

作者:Anders Cui
出处:http://anderslly.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Add your comment

18 条回复

  1. #1楼 vczh[未注册用户]2008-10-10 17:49
    Functional Programming推荐递归,纯FP对此进行了大量的优化。如果写C#的时候也狂用递归,其实也能很快写出来,但关键是我们不敢。

    因为C#就是这个样子。
    就如同为所有东西加上了mutable的F#程序一样,很难看。
    当你用了一处mutable,同时也就消灭了在这个地方进行优化的可能,引入了一个阶的状态,加大了人脑的负担。

    没有mutable的语言是有的,而且用起来也是非常舒服以至于我们忘记了还有变量这种东西。为什么F#用mutable呢?虽然说为了让程序员可以不许要做出太大改变,但是其根本原因是他支持.NET。试问,哪个.NET程序员,不是天天写变量的。没有了mutable,F#在.NET上就会遇到非常多的效率问题,得不偿失。

    反过来,F#在不在.NET上,其实那只是策略。
     回复 引用   
  2. #2楼[楼主] Anders Cui      2008-10-10 22:40
    @vczh
    感谢你的评论
    我感觉F#提供了mutable
    一个原因是你说的对.NET平台的支持,
    第二个则是针对.NET平台下的开发人员
    如果没有mutable这样的机制
    相信很少有人会产生兴趣
    这样深入下去的人就更少了
     回复 引用 查看   
  3. #3楼 Steven Chen      2008-10-21 15:19
    刚刚开始看到lz的这篇文章

    非常感谢lz整理了这么多得资料
    lz辛苦了
     回复 引用 查看   
  4. #4楼[楼主] Anders Cui      2008-10-22 01:35
    @Steven Chen
    For F#, For Fun, Just For Fun:)
     回复 引用 查看   
  5. #5楼 木野狐(Neil Chen)      2008-11-26 10:46
    能不能介绍下 F# 跟 .NET 其他语言比如 C# 的互操作的例子,以及什么情况下适用 F#.
    是整个系统都用 F# 构建呢,还是用来完成部分任务?
     回复 引用 查看   
  6. #6楼[楼主] Anders Cui      2008-11-26 12:47
    @木野狐(Neil Chen)
    嗯,过段时间写一点关于互操作的东西
    这个完全不用担心的,F#也会编译为IL;

    目前F#在UI层的支持还不够
    我感觉还是在局部使用F#完成一些任务比较好;
    在开发一些小工具时使用F#也不错;
     回复 引用 查看   
  7. #7楼 colder[未注册用户]2008-11-26 14:00
    原来我翻译的那段广告还有"雷人"的效果

    楼主对F#的领域显然更系统和深刻
    不像我 虽然已经开始使用 但有些地方仍然弄不清楚 用法也不太合理

    我现在对F#困惑的地方主要有两处:

    1. 泛型有时候反而比C#还难控制, 简单的 public T GenericMethod<T>() 结构, 在F#里都不知道该怎么写才好.

    2. 引用(Quotations)的作用在哪里? 感觉引用表达式应该面临着和DLR的表达式一样的处境, 早晚会合并到LINQ表达式树当中去, 变成它的子集.
    当初alpha的时候没能领悟这东西, 现在装上CTP之后, 我再也没有成功运行过一个例子.

    希望在楼主将来的文章中能够找到答案.
     回复 引用   
  8. #8楼[楼主] Anders Cui      2008-11-26 15:48
    @colder
    我到目前还停留在小打小闹的简单例子上:(

    先说说对你的问题的理解:
    1. F#中用'a这样的类型标注来表示参数为泛型,如
    let genericMethod (x: 'a) : 'a =
    print_any x
    x
    这样x就可以是各种类型参数了。

    2. DLR我不清楚。我对Quotations的理解是,通过它我们可以了解编译器如何表示一段F#代码,这样就可以在运行时对这段代码进行转换,比如转换为其它语言或SQL等,但我没找到很好的描述它的例子。。。
     回复 引用 查看   
  9. #9楼[楼主] Anders Cui      2008-11-26 15:50
    @colder
    http://blogs.msdn.com/chrsmith/archive/2008/05/30/language-oriented-programming-in-f.aspx
    这篇文章里介绍了F#中好几个酷特性的应用
     回复 引用 查看   
  10. #10楼 cobrayang[未注册用户]2008-12-07 19:59
    改来改去总是有两条红线,快崩溃了,请帮忙看下,拜谢!

    #light
    let query = [ 4; 3; 4; 1; 2; 2; 1; 2; 3; 4; 1; 4; 4; 1; 1; 2; 3; 1 ]
    let size = 16
    let protein = new ResizeArray<int>()
    // Find the translation start codon
    let rec startcodon x =
    if query.[x] = 1 && query.[x+1] = 2 && query.[x+2] = 3 then x
    else startcodon (x+1)
    printfn "The translation starts at base pair %A" ((startcodon 0)+1)
    // Find the translation start codon
    let rec stopcodon x =
    if (query.[x] = 2 && query.[x+1] = 1 && query.[x+2] = 1) ||
    (query.[x] = 2 && query.[x+1] = 1 && query.[x+2] = 3) ||
    (query.[x] = 2 && query.[x+1] = 3 && query.[x+2] = 1) then x
    else stopcodon (x+1)
    printfn "The translation stops at base pair %A" ((stopcodon 0)+1)
    // Check whether the sequence legally contains both start and stop codon
    let translationcheck a b =
    if b - a > 0 && (b - a) % 3 = 0 then true
    else false
    let check1 =
    if translationcheck (startcodon 0) (stopcodon 0) = true then
    printfn "can be translated"
    else printfn "The sequence does not contain legal start/stop positions!"
    check1
    // Translate the legal nucleotide sequence in to amino acid sequence
    let translation a b =
    let amino a =
    match query.[a], query.[a+1], query.[a+2] with
    | 1, 2, 3 -> 1
    | 2, 2, 2 -> 2
    | 2, 2, 4 -> 2
    | 2, 2, 1 -> 3
    | 2, 2, 3 -> 3
    | 4, 2, 2 -> 3
    | 4, 2, 4 -> 3
    | 4, 2, 1 -> 3
    | 4, 2, 3 -> 3
    | 1, 2, 2 -> 4
    | 1, 2, 4 -> 4
    | 1, 2, 1 -> 4
    | 3, 2, 2 -> 5
    | 3, 2, 4 -> 5
    | 3, 2, 1 -> 5
    | 3, 2, 3 -> 5
    | 2, 4, 2 -> 6
    | 2, 4, 4 -> 6
    | 2, 4, 1 -> 6
    | 2, 4, 3 -> 6
    | 1, 3, 2 -> 6
    | 1, 3, 4 -> 6
    | 4, 4, 2 -> 7
    | 4, 4, 4 -> 7
    | 4, 4, 1 -> 7
    | 4, 4, 3 -> 7
    | 1, 4, 2 -> 8
    | 1, 4, 4 -> 8
    | 1, 4, 1 -> 8
    | 1, 4, 3 -> 8
    | 3, 4, 2 -> 9
    | 3, 4, 4 -> 9
    | 3, 4, 1 -> 9
    | 3, 4, 3 -> 9
    | 2, 1, 2 -> 10
    | 2, 1, 4 -> 10
    | 4, 1, 2 -> 11
    | 4, 1, 4 -> 11
    | 4, 1, 1 -> 12
    | 4, 1, 3 -> 12
    | 1, 1, 2 -> 13
    | 1, 1, 4 -> 13
    | 1, 1, 1 -> 14
    | 1, 1, 3 -> 14
    | 3, 1, 2 -> 15
    | 3, 1, 4 -> 15
    | 3, 1, 1 -> 16
    | 3, 1, 3 -> 16
    | 2, 3, 2 -> 17
    | 2, 3, 5 -> 17
    | 2, 3, 3 -> 18
    | 4, 3, 2 -> 19
    | 4, 3, 4 -> 19
    | 4, 3, 1 -> 19
    | 4, 3, 3 -> 19
    | 1, 3, 1 -> 19
    | 1, 3, 3 -> 19
    | 3, 3, 2 -> 20
    | 3, 3, 4 -> 20
    | 3, 3, 1 -> 20
    | 3, 3, 3 -> 20
    | 2, 1, 1 -> 0
    | 2, 1, 3 -> 0
    | 2, 3, 1 -> 0
    let mutable x = a
    while ( x <= b ) do
    protein.Add(amino x);
    x <- x + 3;
    done;
    // Covert protein array into amino acid sequence
    translation (startcodon 0) (stopcodon 0)
    protein.Remove(0)
    printfn "%A" protein
    let amino_acid x =
    match x with
    | 1 -> "Met"
    | 2 -> "Phe"
    | 3 -> "Leu"
    | 4 -> "Ile"
    | 5 -> "Val"
    | 6 -> "Ser"
    | 7 -> "Pro"
    | 8 -> "Thr"
    | 9 -> "Ala"
    | 10 -> "Tyr"
    | 11 -> "His"
    | 12 -> "Gln"
    | 13 -> "Asn"
    | 14 -> "Lys"
    | 15 -> "Asp"
    | 16 -> "Glu"
    | 17 -> "Cys"
    | 18 -> "Trp"
    | 19 -> "Arg"
    | 20 -> "Gly"
    let intoamino = List.map amino_acid query
    printfn "%A" intoamino
     回复 引用   
  11. #11楼[楼主] Anders Cui      2008-12-08 01:27
    @cobrayang
    我这边没有两跟红线,只有三根蓝线 :)
    这些警告不影响编译通过
    你的红线估计是缩进的问题
    另外我用的版本是1.9.6的;

    警告信息最好修改一下
    其中有两个是因为模式匹配不完整
    另一个是protein.Remove(0)
    这个改成protein.Remove(0) |> ignore就可以了
    我把改好的文件发到你gmail了。
     回复 引用 查看   
  12. #12楼 cobrayang[未注册用户]2008-12-08 08:32
    非常感谢您的回复!技术高,品德好,赞一个:)
     回复 引用   
  13. #13楼[楼主] Anders Cui      2008-12-08 11:53
    @cobrayang
    过誉了,呵呵
    不过你的程序我看不懂。。。
     回复 引用 查看   
  14. #14楼 taotao123[未注册用户]2009-03-04 09:29
    作为懒惰的、颓废的、不想改变自己、光想别的事物来适应我的 人,我当然希望这个语言,还能接近我平常说的语言,越接近越好。【谁没事喜欢学别的语言啊 一门英语已经够烦了】

    但是纯逻辑的电脑比较喜欢数学语言 恨不得说(sinα+sin(α+2π/n)+sin(α+2π*2/n)+sin(α+2π*3/n)+……+sin[α+2π*(n-1)/n]=0) 这个与普通人差距实在太大【谁要这么敢和我说话,除了数学老师 我就抽他】

    一方面是逻辑混乱 罗哩罗嗦的人类语言、另一方面又是纯逻辑 简洁明了的电脑语言。没办法折中吧,当然折中也有偏向。 F井(我用中文bs我吧)就是偏向电脑的那种,这么语言既然离人民群众远,人民群众不鸟它也是应该的。
     回复 引用   
  15. #15楼 Jaxu      2009-08-20 10:36
    有人说学习一门新的编程语言是人生的一种享受,因为它总是会不断地给你带来惊喜;但也有人说这是一种痛苦,因为你总是要不断地接受很多新鲜的事物。我是徘徊在这两种之间的人,前段时间刚刚看完了Python的教程,因为工作的原因,现在又有幸接触到MS的VS 2010和Office 2010,于是想看看外面的世界又发生了什么翻天覆地的变化。无意之中在Google上找到了楼主的这篇文章,看来对我学习F#会有很大的帮助,非常感谢楼主的分享!
     回复 引用 查看   
  16. #16楼[楼主] Anders Cui      2009-08-20 20:05
    @Jaxu
    最近我又重拾F#了,多多交流:)
     回复 引用 查看   
  17. #17楼 天天不在      2010-03-09 14:16
    期待LZ后续啊.
    我的F#知识全是从你这得来的.非常感谢你的系列随笔.
     回复 引用 查看   
  18. #18楼 billdog      2010-07-15 15:57
    期待更新~

    英文的电子书看起来太慢了~ ^_^
     回复 引用 查看