我们声明的 readValues 函数,从 XML 文档中读取值,最后一个参数是解析函数,用于将每个数据点转换到适当类型的值。我们下载的数组包含了以平方公里计的三个数据集的面积,和森林覆盖率的三个数据集。清单 13.16 显示了把原始文档转换成数据结构,从中可以方便提取重要信息。
清单 13.16 把原始数据转换成类型化的数据结构 (F#)
let areas =
Seq.concat(data.[0..2]) [1]
|> readValues (fun a -> float(a) * 1.0<km^2>) [2]
|> Map.ofSeq [3]
let forests =
Seq.concat(data.[3..5])
|> readValues (fun a -> float(a) * 1.0<percent>)
|> Map.ofSeq
在进行管道处理之前,先把表示第一个指标的所有页面中的数据连接起来[1],再把每个值从字符串转换成以平方公里计的数值[2],然后,用数据生成映射(Map)[3]。第二个命令,处理森林覆盖率,与此类似。
数据处理的主要部分使用管道运算,这是一种新功能,我们还没未介绍过,它从数据集中取前三个元素。这称为切片(slicing),语法 data.[0..2] 生成的序列,包含了索引从 0 到 2 的数组项[1]。用 Seq.concat 连接返回的序列,这样,就能得到一个序列,包含所有年份数据的。管道运算的下一步是读这些值,再转换成适当的带计量单位的类型[2]。这外转换变成了最简单的部分,就是简单的 lambda 表达式!要注意的是,世界银行使用点作为分隔符,所以,数字就如 1.0。内置的 float 函数始终使用固定的区域设置,因此,在任何系统上,它都能正确解析字符串[ 不知道说的是什么意思 ]。
我们使用 Map.ofSeq 函数,从数据生成 F# 映射类型[3]。这个函数参数为包含元组的序列,第一个元素是键,第二个元素是值。在清单 13.16 中,键的类型为 int * string,包含年和地区名。第一种情况值的类型为 float
时间: 2024-10-12 05:38:37