所以我有一些大小为4的元组,就像(int,int,int,int)
一样如果它是2元组,我可以使用fst(myTuple)来引用第一个元素。我怎么能说,参考4元组的第三个元素?
答案 0 :(得分:8)
使用模式匹配:
let tup = 1, 2, 3, 4
let _,_,third,_ = tup
printfn "%d" third // displays "3"
这在元组的MSDN文档中有直接描述:Tuples (F#)
答案 1 :(得分:4)
这是@Daniels新颖解决方案的一个版本,它计算基础元组表示的Rest
偏移量,以支持对任意长元组的基于位置的访问。错误处理被省略。
let (@) t idx =
let numberOfRests = (idx - 1) / 7
let finalIdx = idx - 7 * numberOfRests
let finalTuple =
let rec loop curTuple curRest =
if curRest = numberOfRests then curTuple
else loop (curTuple.GetType().GetProperty("Rest").GetValue(curTuple, null)) (curRest+1)
loop t 0
finalTuple
.GetType()
.GetProperty(sprintf "Item%d" finalIdx)
.GetValue(finalTuple, null)
|> unbox
//fsi usage:
> let i : int = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36)@36;;
val i : int = 36
答案 2 :(得分:3)
对于纯粹的新颖性,这里有一个重载的运算符,适用于任何*大小的元组。
let (@) t idx =
match t.GetType().GetProperty(sprintf "Item%d" idx) with
| null -> invalidArg "idx" "invalid index"
| p -> p.GetValue(t, null) |> unbox
//Usage
let t = 4, 5, 6
let n1 : int = t@1 //4
let i = 2
let n2 = t@i //5
*在这种情况下,任何意义都有限,特别是最多7个。
答案 3 :(得分:1)
如果你想随机访问一般大小的元组,那就不可能了。对于任何给定的大小,你可以按照ildjarn的答案(将它扩展为四,五等),但它是唯一的(功能)方式。
一般来说,元组的一种可能性是首先将其转换为列表,如here所示,但这并不是太漂亮,因为它需要反射。