F# 如何选择列表中的第一组元素?

F# 如何选择列表中的第一组元素?,f#,F#,如何通过索引选择列表中的第一组元素 我试着认为它是功能性的,即使下面的代码在尝试检索前两张卡时有点必要 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 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);;

像这样的怎么样

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
我刚刚使用了一个简单的选项类型,但您可能希望使用一个更具描述性的联合案例来处理从有可用卡的牌组进行交易以及尝试从空牌组进行交易


编辑:我从选项类型中删除了deck列表,因为您总是可以将空deck映射回空deck,这在某些用例中可能很方便。

类似的东西怎么样

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
我刚刚使用了一个简单的选项类型,但您可能希望使用一个更具描述性的联合案例来处理从有可用卡的牌组进行交易以及尝试从空牌组进行交易


编辑:我将组列表从选项类型中去掉,因为您总是可以将空组映射回空组,这在某些用例中可能很方便。

您可以使用模式匹配:

let card1 :: card2 :: unused = deck

请注意,对于少于两张卡片的卡片组,此操作失败,索引也失败。

您可以使用模式匹配:

let card1 :: card2 :: unused = deck

请注意,对于少于两张卡片的卡片组,此操作失败,索引也失败。

谢谢InnerLight。不过,我正在与客户电话搏斗:让Somecard1,card2,剩余=交易洗牌牌组@ScottNimrod希望更新能有所帮助。我不确定你想如何处理无卡的情况,但我正试图避免异常,让成功/失败由选项类型来处理。谢谢InnerLight。不过,我正在与客户电话搏斗:让Somecard1,card2,剩余=交易洗牌牌组@ScottNimrod希望更新能有所帮助。我不确定你想如何处理无卡的情况,但我试图避免异常,让成功/失败由选项类型来处理。