2015-12-03 30 views
0

如何通過索引選擇列表中的第一組元素?如何選擇列表中的第一組元素?

儘管下面的代碼在嘗試檢索前兩張卡時有點必要,但我試圖去思考功能。

let deal (deck: Card list) = 
// ------------------------------------ 
// let card1 = deck |> Seq.item 0 // Rewrite this logic of getting first two cards 
// let card2 = deck |> Seq.item 1 
// ------------------------------------ 
    let hand = [<get first two elements in deck>] 
    let deckUsed = deck |> Seq.except [card1; card2;] 
    (card1, card2, deckUsed);; 

回答

3

這個怎麼樣?

let deal = 
    function 
    |card1::card2::deckUsed -> Some (card1, card2), deckUsed 
    |_ -> None, [] 

您可以檢索結果:

let hand, newDeck = deal deck 
    match hand with 
    |Some (card1, card2) -> // do something with the cards 
    |None -> // do something if no cards 

我只是用一個簡單的選擇類型,但你可能想使用一個更具描述性的工會情況來處理從甲板處理可用卡和試圖從空的甲板上處理。

編輯:我將甲板列表從選項類型中取出,因爲您總是可以將空甲板映射回空甲板,這在某些使用情況下可能會很方便。

+0

感謝InnerLight。儘管如此,我仍然苦苦掙扎:讓Some(card1,card2),剩下的=交易(洗牌甲板);; –

+0

@ScottNimrod希望更新幫助。我不太確定你想如何處理沒有卡的情況,但我試圖避免例外,並讓選項類型處理成功/失敗。 – TheInnerLight

2

你可以使用模式匹配:

let card1 :: card2 :: unused = deck 

注意這個失敗的deck s的不到兩卡一樣,索引。

相關問題