我写了这个 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]'已根据此程序点之前的信息用于不确定类型的对象。考虑添加更多类型约束
谁能告诉我我做错了什么?
我写了这个 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]'已根据此程序点之前的信息用于不确定类型的对象。考虑添加更多类型约束
谁能告诉我我做错了什么?
解决您遇到的错误的简单方法如下:
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
都有 type string * int * int
。
由于您不需要元组的第三个元素,您甚至可以选择不将其绑定到符号,方法是编写如下第二行:
let tupleSubset = tuples |> Seq.map (fun (a, b, _) -> a, b)
Shredderoy 的解释是正确的,通过索引访问元素是保留给数组的,数组是连续的内存块。
对于元组,如果要在 F# 中访问元组的值,一般方法是模式匹配
let tuple = a,b,c
let (x,y,z) = tuple
在pair的情况下,函数fst
和snd
也提供类似的访问
PS:在您的初始数组中,您不需要使用括号,因为编译器将其识别,
为元组