2016-11-14 145 views
2

有名單在F#的列表:如何從F#中的數組列表中提取元素?

> wCost;; 
val it : (float * float) list = 
    [(0.1, 13.61972782); (1.527722646, 1.123863823); 
    (1.850460992, 0.4853361402); 
    (1.923416366, 0.452707936); (1.939908012, 0.4510406634); 
    (1.943635968, 0.4509554673); (1.944478676, 0.4509511138)] 

我可以索引檢索第一個列表:

> wCost.[0];; 
val it : float * float = (0.1, 13.61972782) 

但是,如果我將檢索第一個列表的第二個元素,不幸的是,與我預期的不一樣

e.g. wCost[0][0] // it cannot retrieve the second element of first list. 
13.61972782 

請隨意評論如何檢索列表元素。謝謝。

回答

4

在你的例子中wCost(float * float) list類型,它不是列表列表,而是元組列表。在F#元組沒有索引訪問的支持,所以你可能要麼需要的元組轉換爲兩個元素的列表

wCost 
|> List.map (fun (x,y) -> [x; y]) 

,或者使用元組函數來訪問單個元素

wCost.[0] |> fst 

wCost.[0] |> snd 
+0

謝謝。如果我有很長的一系列元素,看起來我可以通過類矩陣索引訪問元素。 –

7

你實際上有一個列表元組,而不是列表的列表。

這意味着,當您第一次爲列表建立索引時,您將返回一個元組(即int * int)而不是列表。

要訪問的元素,從而使用fstsnd關鍵字來訪問的元素:看https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/operators.fst%5B 'T1,' T2%5D-功能 - %5Bfsharp%5D

在你的情況,你會寫fst (wCost.[0])得到你想要的東西。

+0

謝謝你的幫助。 –