肇默步 发表于 2025-5-29 20:18:05

结合实例学习F#(一) --快速入门

 F#随着VSTS 2010 Beta1 发布也有一段时间了,园子里应该也有不少人对它感兴趣吧。下面的例子是我在学F# 基本语法时写的一个简单Sieve of Eratosthenes 实现,通过剖析这一小段代码,我希望大家能对F#有个简单认识,并能自己写一些简单的小程序。
 1 let GetAllPrimesBefore n = 
 2     let container = Array.create (n+1) 0
 3     let rec loop acc = function
 4         |[] -> List.rev acc
 5         |hd::tl -> 
 6             if container. =1 then 
 7                 loop acc tl
 8             else
 9                 for j in  do
10                     container.  List.rev acc
3         |hd::tl -> 
4             if container. =1 then 
5                 loop acc tl
6             else
7                 for j in  do
8                     container.  printfn "Hello, C# developer!"
    | "F#" -> printfn "Hello, F# developer!"
    |_ -> printfn "Hello, other developers!"因为Pattern Matching在F#中的使用范围实在太广了,所以就引入了一种简化版,这就是上面大家看到的等号后面的function的作用,我们可以把上面的例子简化成
let ShowGreeting  = function    
    | "C#" -> printfn "Hello, C# developer!"
    | "F#" -> printfn "Hello, F# developer!"
    |_ -> printfn "Hello, other developers!"怎么样?既少了给参数起名的烦恼,也少敲不少字吧,嘿嘿。

接下来我再简单介绍下F#中非常重要的一个基本类型List, 其基本表示形式为 [ item1;item2; .. ;itemn]
F#中List是immutable类型,我们只能访问里面的值,不能改动里面的值,任何改动List的需求只能通过构建新的List来实现。稍一思考,大家就会很快发现要实现一个高效的immutable list, 那最简单的就是对其头结点进去操作了(插入和删除都可以达到O(1),当然插入和删除会构建一个新的List,原List不会改变),F#中的List也是基于这种形式,所有的List都可以看成是Head+Tail(除了Head外的所有结点),F#提供了相应的库函数List.hd, List.tl,并且提供了:: (cons operator)来帮助我们方便的构建一个List,比如1::2::[]就表示List (注意1和2之间我用的是;不是, 如果写成,那个表示该List只有一个元素 (1,2),至于(1,2)是什么类型,为了使文章尽量紧凑,我们今天就不讲了)

有了上面这些知识,再看本文一开始的函数就简单多了
 let rec loop acc = function
        |[] -> List.rev acc
        |hd::tl -> 
            if container. =1 then 
                loop acc tl
            else
                for j in  do
                    container. 
页: [1]
查看完整版本: 结合实例学习F#(一) --快速入门