F#使用Seq.map创建较小的元组

时间:2013-05-30 20:54:23

标签: f#

我写了这个F#代码:

let tuples = [|("A",1,0);("A",2,3);("A",3,6)|]
let tupleSubset =
tuples
|> Seq.map(fun values -> 
    values.[0],
    values.[2])
printfn "%A" tupleSubset

我得到:运算符'expr。[idx]'已根据此程序点之前的信息用于不确定类型的对象。考虑添加更多类型约束

谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:6)

解决您遇到的错误的简单方法如下:

let tuples = [|("A",1,0); ("A",2,3); ("A",3,6)|]
let tupleSubset = tuples |> Seq.map (fun (a, b, c) -> a, b)
printfn "%A" tupleSubset

至于为什么会出现错误:请注意,您尝试使用values.[0]values.[1]解除引用的索引类型适用于数组,字典等,但不适用于元组,而每个values的类型为string * int * int

由于你不需要元组的第三个元素,你甚至可以选择不将它绑定到符号,方法是写第二行,如下所示:

let tupleSubset = tuples |> Seq.map (fun (a, b, _) -> a, b)

答案 1 :(得分:0)

对Shredderoy的解释是正确的,通过索引访问元素保留给数组,这些数组是连续的内存块。

对于元组,如果要访问F#中元组的值,一般方法是模式匹配

let tuple = a,b,c
let (x,y,z) = tuple

对于 pair ,函数fstsnd也提供类似的访问

PS:在初始数组中,您不需要使用括号,因为编译器会将,识别为元组