Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#使用Seq.map创建较小的元组_F# - Fatal编程技术网

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

F#使用Seq.map创建较小的元组,f#,F#,我写了这个F#代码: 我得到:运算符“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 至于出现错误的原因:请注意,您尝试使用值。

我写了这个F#代码:

我得到:运算符“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
至于出现错误的原因:请注意,您尝试使用
值。[0]
值。[1]
对数组、字典等有效,但对元组无效,而每个
都有
字符串*int*int
类型

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

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

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

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

let tuple = a,b,c
let (x,y,z) = tuple
对于pair,函数
fst
snd
也提供类似的访问


PS:在初始数组中,不需要使用括号,因为编译器会将
识别为元组,我不清楚为什么会否决。对我来说,这似乎是一个合理的问题。你想告诉他什么?我的F#生锈了。@neontapir,我的猜测是,在看到符号
x[n]
时,类型推断机制期望我上面提到的一种数据类型,该符号适用于其中一种,但它到那时为止的类型计算未能找到其中一种类型。作为后续,我正在实际应用程序中实现此模式。函数正在返回一个Seq。当我在另一个函数中引用此函数时,我得到一个“类型”单位->Seq与我尝试Seq.Map时的类型Seq不兼容。有什么想法吗?@JamieDixon-在引用它的地方添加一个
()
来调用函数omg-就是这样!谢谢大家!这不太正确-你可以使用
[]
运算符。大多数类型通常由数组支持,但这不是必需的(例如,对于愚蠢的示例,
type T()=成员this.Item with get(n:string)=n.Length
T().“test”
返回
4
)。
let tuple = a,b,c
let (x,y,z) = tuple