Chapter3 - List Comprehensions
这次我们介绍一些列表初始化跟操作的便捷方式
你可以使用一些特殊的语法来初始化 list,sequences跟arrays(list我们就知道了,而sequences
则对应 .net 的 IEnumerable 类型, arrays后面的章节会介绍)
最简单的初始化一个连续的列表方法是使用 ..,看示例
let numericList = [0 .. 9]
//numericList是一个从0~9的列表[0;1;2;3....;9]
let alpherSeq = {'A' .. 'Z'}
//alpherSql 是一个从A - Z的序列
let multiplesOfThree = [0 .. 3 ..30]
//返回的是从0开始的所有3的倍数
//[0;3;6;9;.....;27;30]
let revNumber = [9 .. -1 .. 0]
//返回的是 [9;8;7;6;5;4;3;2;1;0]
//numericList是一个从0~9的列表[0;1;2;3....;9]
let alpherSeq = {'A' .. 'Z'}
//alpherSql 是一个从A - Z的序列
let multiplesOfThree = [0 .. 3 ..30]
//返回的是从0开始的所有3的倍数
//[0;3;6;9;.....;27;30]
let revNumber = [9 .. -1 .. 0]
//返回的是 [9;8;7;6;5;4;3;2;1;0]
可见,[x..y..z]中,x为初始值,y为步长,z为结束值
即最后的列表会是 [x; x+y; x+y+y; x+y+y+y ....z] 直到z = x + (? * y)
另外一个初始化的方法便是可以使用循环加上条件;
let squares =
[ for x in 1 .. 10 -> x * x]
//获取1~10的所有数字的平方组成的列表
//let evens n =
// [for x in 1 .. n when x % 2 = 0 -> x]
//作者提供的这个已经不适用了。
//一般推荐使用内置函数
//下面我给出一个利用了前面介绍的各种知识的集合来实现原作者上面语句的表达式
let evens = fun n -> List.filter (fun x -> x % 2 = 0) [0..n]
[ for x in 1 .. 10 -> x * x]
//获取1~10的所有数字的平方组成的列表
//let evens n =
// [for x in 1 .. n when x % 2 = 0 -> x]
//作者提供的这个已经不适用了。
//一般推荐使用内置函数
//下面我给出一个利用了前面介绍的各种知识的集合来实现原作者上面语句的表达式
let evens = fun n -> List.filter (fun x -> x % 2 = 0) [0..n]
像这样调用evens
evens 10
//返回0~10的所有偶数
接着还有一种,
//let squarePoints n =
// { for x in 1 .. n
// for y in 1 .. n -> x,y}
//同样的,此方法在F# 2.0已经不可再使用了,而应该改为:
let squarePoints n = [for x in 1 .. n do
for y in 1 .. n do
yield x,y]