tryFindIndex
函數搜索指定爲第二個參數的數組中的單個元素。 lambda函數只獲取一個參數,如果參數是您正在查找的元素,它應返回true
。該tryFindIndex
函數的類型簽名表明這一點:
('a -> bool) -> 'a [] -> int option
(在你的榜樣,你給它一個函數,'a -> 'a -> bool
類型,這與預期的類型不兼容的兩個參數)。 tryFindIndex
函數返回一個選項類型,這意味着如果沒有元素與謂詞相匹配,它會給你None
,否則它給你Some(idx)
包含找到的元素的索引。
要獲得所需的索引數組,您需要爲輸入數組的每個元素運行tryFindIndex
(arrX
)。這可以使用Array.map
函數完成。如果你想獲得-1,如果沒有被發現的元素,你可以使用模式匹配None
轉換爲-1,Some(idx)
到idx
:
let desired =
arrX |> Array.map (fun x ->
let res = Array.tryFindIndex (fun y -> x = y) arrY
match res with
| None -> -1
| Some idx -> idx)
同樣的事情可以使用序列式寫入(而不是map
),這可能是更可讀:
let desired =
[| for x in arrX do
let res = Array.tryFindIndex (fun y -> x = y) arrY
match res with
| None -> yield -1
| Some idx -> yield idx |]
無論如何,如果你需要實現一個加入般的操作,您可以在更簡單地使用序列表達式做。在下面的例子中,我還添加了一些值(除了字符串鍵),這樣就可以更好地看到它是如何工作的:
let arrX= [|"A",1; "B",2; "C",3; "D",4; "E",5; "F",6|]
let arrY = [|"E",10; "A",20; "C",30|]
[| for x, i in arrX do
for y, j in arrY do
if x = y then
yield x, i, j |]
// Result: [|("A", 1, 20); ("C", 3, 30); ("E", 5, 10)|]
序列表達循環遍歷所有arrX
元素,併爲他們每個人,它遍歷所有arrY
元素。然後它測試鍵是否相同,如果它們是,它會產生一個單一的元素。這並不是特別有效,但在大多數情況下,它應該可以正常工作。
這是完美的 - 非常感謝 –
很高興我可以幫助:-)。我還添加了一個關於使用序列表達式實現類似連接的操作的註釋。 –
這是相當有用的 - 謝謝。順便說一句,我只是讀你的書,而現在正試圖寫代碼而不提及它(太多)。 –