F#基础教程 列表概括

      列表概括使创建和转化集合更加容易。你可以创建F#列表、序列、和数组而直接使用概括语法(关于数组,序列类型将在下一章介绍,这些都是.NET BCL’s 集合类型)。最简单的概括是指定范围的项目集合,通过(..)开始一个起源,到一个结束。下面给出一个示例:

#light
let numericList = [ 0 .. 9 ]
let alpherSeq = { 'A' .. 'Z' }
printfn "%A" numericList
printfn "%A" alpherSeq
执行结果:
[0; 1; 2; 3; 4; 5; 6; 7; 8; 9]
seq ['A'; 'B'; 'C'; 'D'; ...]

      为了创建更有意义的集合,你也可以指定一个递增的数字,语法是两组(..)分割的三部分,分别为起始,步长与结束,注意,字符不支持这种类型的概括语法。下面给出一个示例。

#light
let multiplesOfThree = [ 0 .. 3 .. 30 ]
let revNumericSeq = [ 9 .. -1 .. 0 ]
printfn "%A" multiplesOfThree
printfn "%A" revNumericSeq


执行结果:
[0; 3; 6; 9; 12; 15; 18; 21; 24; 27; 30]
[9; 8; 7; 6; 5; 4; 3; 2; 1; 0]

      还有一种列表概括是通过循环一个集合来创建另一个集合。这种想法是,枚举旧的集合,转换每个项目,并置于新集合中。使用关键字for,其后指定一个标识符,其后是关键字in,然后一个列表概括,-> 指向一个表达式。下面是一个示例。

#light
let squares =
  { for x in 1 .. 10 -> x * x }
print_any squares
执行结果:

seq [1; 4; 9; 16; ...]

 

      你还可以添加一个条件过滤你不想收集的项目。使用when关键字创建一个布尔表达式,只要当表达式为true时,项目才参与转换。

[vs2010 F# 里此代码无法执行]

#light
let evens n =
  { for x in 1 .. n when x % 2 = 0 -> x }
print_any (evens 10)
执行结果:
seq [2; 4; 6; 8; ...]


      可以在两个或多个维度上为每个维度使用循环进行列表概括。下面的例子演示了具体的方法。

[vs2010 F# 里此代码无法执行]

#light
let squarePoints n =
  { for x in 1 .. n
    for y in 1 .. n -> x,y }
print_any (squarePoints 3)

执行结果:
[(1, 1); (1, 2); (1, 3); (2, 1); ...]

posted @ 2011-11-23 16:19  银河系漫游指南  阅读(360)  评论(1编辑  收藏  举报