F#使用Seq.map创建较小的元组
我写了这个F#代码: 我得到:运算符“expr.[idx]”已根据此程序点之前的信息用于不确定类型的对象。考虑添加其他类型约束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 至于出现错误的原因:请注意,您尝试使用值。
有人能告诉我我做错了什么吗?一个简单的方法是:
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