从序列,元组中提取元素

时间:2014-04-03 06:09:30

标签: f# f#-interactive f#-3.0 c#-to-f#

说我有这个:

let coor = seq { ... }
// val coor : seq<int * int> = seq[(12,34); (56, 78); (90, 12); ...]

我试图获取序列中第二个元素的第一个数字的值,在本例中为56.查看MSDN Collection API引用,Seq.nth 1 coor返回(56, 78),类型为seq <int * int>。我如何从中获得56个?

2 个答案:

答案 0 :(得分:3)

这是tuple,因此您可以使用函数fst;

> let value = fst(Seq.nth 1 coor);;
val value : int = 56

...或通过模式匹配访问它;

> let value,_ = Seq.nth 1 coor;;    
val value : int = 56

答案 1 :(得分:2)

我建议你阅读Tuple文章: http://msdn.microsoft.com/en-us/library/dd233200.aspx

有几个例外可能会对这个问题有所了解:

函数fst用于访问元组的第一个元素:

(1, 2) |> fst // returns 1

函数snd用于访问第二个元素

(1, 2) |> snd // returns 2

为了从更宽的元组中提取元素,您可以使用以下语法:

let _,_,a,_ = (1, 2, 3, 4) // a = 3

要在各种集合中使用它(传递给集合函数的lambda),让我们从以下顺序开始:

let s = seq {
        for i in 1..3 do yield i,-i
    }

我们最终

seq<int * int> = seq [(1, -1); (2, -2); (3, -3)]

假设我们只想提取第一个元素(注意lambda的参数):

s |> Seq.map (fun (a, b) -> a)

甚至更短:

s |> Seq.map fst

让我们回到你的问题。

s |> Seq.nth 1 |> fst