F#学习之路(7)集合类型

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

     一、数组类型 (Array)

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

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


let  arr=[ | 1 ; 2 ; 3 | ]

let  jaggedArr=[ |
                     [
| 1 ; 2 | ];
                     [
| 3 ; 4 ; 5 | ]
                   
| ]

     

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

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

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

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

# light

let  a=Array2.create  10   20   0  
Array2.iteri (
fun  i j item ->  printfn  " no %d,%d :%A "  i j item) a

System.Console.ReadKey(
true | >ignore

 

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

let  a=Array2.create  10   20   0  
a.[
5 , 5 ] <- 8      
Array2.iteri (
fun  i j item ->  printfn  " no %d,%d :%A "  i j item) a   
    
let  arr=[ | 1 ; 3 ; 4 | ]
printfn 
" %A "  arr.[ 0 .. 2 ]
    
let  c=[ |
        [
| 1 ; 2 | ];
        [
| 3 ; 4 ; 5 | ]
       
| ]
    
printfn 
" %d "  (c.[ 1 ].[ 2 ])

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

     

     二、可变数组类型(ResizeArray)

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

let  b= new  ResizeArray<_>()
b.AddRange(seq{
for  i  in   1 .. 100   -> i})
b.[
5 ] <- 8
b.ForEach((
fun  i -> printfn  " %d "  i))

    

     三、键值对类型Map。

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

let  m=Map.add  1   " 1 "  Map.empty
    
for  v  in  m  do  
  printfn 
" %A "  v

let  n=Map.of_list [ for  key  in   1 .. 100   do  yield key,key.ToString()]
    
| >Map.iter ( fun  key value  -> printfn  " %d %s "  key value)

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

     

     四、Set类型

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

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

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

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

 

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

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

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

               

      下一篇:F#学习之路(8)模式匹配

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值