当前位置:主页   - 电脑 - 网站开发 - ASP.Net
F#学习之路(7)集合类型
来源:网络   作者:   更新时间:2012-04-01
收藏此页】    【字号    】    【打印】    【关闭

  上一篇博客,介绍了列表类型,本篇将介绍数组类型Array、字典类型(Map),以及可变数组(ResizeArray)、Set类型。

  一、数组类型 (Array)

  数组类型,在语义上表示一组相同类型的集合。这个跟列表(List)相似,两者的区别在于列表类型数据元素不可变,而数组类型可以。虽然数组类型随机访问,在查询访问上性能优先列表,但列表在变更集合(增加、删除集合元素)上有更好的性能。这个跟大多数语言是相似的。

  定义数组类型的语法,跟列表也很相似,区别在于数组多了两个"|"符合。

letarr=[|1;2;3|]
letjaggedArr=[|
           [|1;2|];
           [|3;4;5|]
          |]

  arr为一维数组,类型为int array。jaggedArr数组为int array array

  F#数组与c#很相似,有两种类别的数组,一种叫矩形(rectangle)数组,另一种叫锯齿(jagged)数组

  矩形数组,在数字意义上,就是矩阵(matrix),一维数组也叫矢量或向量(vector)。注意锯齿数组内嵌的数组长度不相等。

  在F#中共定义了三个模块来处理数组类型。Array,Array2,Array3,分别用来处理一维、二维、三维数组。

#light
leta=Array2.create10200
Array2.iteri(funijitem->printfn"no%d,%d:%A"ijitem)a
System.Console.ReadKey(true)|>ignore

  a类型为int [,],是一个二维数组。

leta=Array2.create10200
a.[5,5]<-8  
Array2.iteri(funijitem->printfn"no%d,%d:%A"ijitem)a 
  
letarr=[|1;3;4|]
printfn"%A"arr.[0..2]
  
letc=[|
    [|1;2|];
    [|3;4;5|]
   |]
  
printfn"%d"(c.[1].[2])

  从上面的代码可以看出,F#除支持与c#类似的访问方法外,还对一维数组支持范围区间访问语法。  

  二、可变数组类型(ResizeArray)

  ResizeArray类型,只是.net 类型 System.Collections.Generic.List泛型类型的别名。ResizeArray长度可变,数据元素可变,很显然这个类型难以保证线程安全,应优先使用F#的List类型。

letb=newResizeArray<_>()
b.AddRange(seq{foriin1..100->i})
b.[5]<-8
b.ForEach((funi->printfn"%d"i))

  三、键值对类型Map。

  Map类型,不同于.net的System.Collections.Generic.Dictionary类型,Map类型是不可变类型。

letm=Map.add1"1"Map.empty
  
forvinmdo
 printfn"%A"v
letn=Map.of_list[forkeyin1..100doyieldkey,key.ToString()]
  
n|>Map.iter(funkeyvalue->printfn"%d%s"keyvalue)

  上面的代码可以看出Map.add函数创建Map类型比较麻烦,通过of_list,of_array,of_seq等函数创建字典比较方便。

  四、Set类型

  Set类型,不同于List之处,在于集合中数据是唯一的,不存在两条相等的数据成员。

Set.of_list["1";"2";"1"]|>Set.iter(funitem->printfn"%s"item)//12

  Set类型,还支持两个Set类型的相交、合并,取子集合等操作  

Set.of_seq(
      seq{foriin1..10->i})
        -Set.of_list[1;3;6]
    |>Set.iter(funitem->printfn"%d"item)//2;4;5;7;8;9;10

  集合在日常编程中占据了重要了位置,本文对F#集合类型的技术细节没有进行讨论。

  到本篇博客为止,已经讨论了基本类型、集合类型、元组类型、函数类型。记录类型,不准备专门讲解,可以阅读从c#3.0到F#,序列seq类型,我不打算在本系列中讨论,因为不讨论计算表达式,序列无法说清。下一篇博客将讨论模式匹配,这样,基本上F#函数编程范式基本知识讨论完了。

  接下来,我就集中研究函数式编程中一些高级特性,例如组合子,CPS,Monad。希望条件成熟,我另开一个系列来讨论。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明