gpt4 book ai didi

scala - 将状态单子(monad)结果从程序中的一个步骤传递到另一个步骤+提前停止

转载 作者:行者123 更新时间:2023-12-02 17:58:04 25 4
gpt4 key购买 nike

我有以下步骤:

trait BlackjackSteps {
def gamerTakesTwoCards(gamerName:String): State[Deck, Gamer]
def dealerTakesTwoCards: State[Deck, Dealer]
def isBlackjack(gamer: Gamer, dealer: Dealer): Option[Player]
def gamerDrawsCards(gamer: Gamer): State[Deck, Gamer]
def dealerDrawsCards(dealer: Dealer, gamer: Gamer): State[Deck, Dealer]
def determineWinner(gamer: Gamer, dealer: Dealer): Player

def program(gamerName:String): State[Deck, Player] = for {
gamer <- gamerTakesTwoCards(gamerName)
dealer <- dealerTakesTwoCards
//winner = isBlackjack(gamer, dealer)
gamerFinal <- gamerDrawsCards(gamer)
dealerFinal <- dealerDrawsCards(dealer, gamerFinal)
winnerFinal = determineWinner(gamerFinal, dealerFinal)
} yield winnerFinal
}

两个问题:

  • 如何获取由 gamerTakesTwoCards 生成的牌组并将其传递给 DealerTakesTwoCards?

  • isBlackjack 可能会导致获胜者,在这种情况下我需要停止并返回获胜者。我怎样才能改变上面的代码来做到这一点?

游戏:

  • 玩家和荷官玩游戏
  • 他们都抓了两张牌
  • 如果没有 21 名获胜者
  • 玩家一直抓牌直到 17 点
  • 得分不超过 21 分的最高玩家获胜!

完整代码在这里:https://bitbucket.org/jameskingconsulting/blackjack-scala/src/master/

编辑:

我已经对理解进行了脱糖处理,只是为了弄清楚发生了什么:

def program(gamerName:String): State[Deck, Player] =
gamerTakesTwoCards(gamerName).flatMap( gamer =>
dealerTakesTwoCards.flatMap(dealer =>
isBlackjack(gamer, dealer).fold(

gamerDrawsCards(gamer).flatMap( gamerFinal =>
dealerDrawsCards(dealer, gamerFinal).map( dealerFinal =>
determineWinner(gamerFinal, dealerFinal)
)
)

)(State.pure[Deck, Player])
))

最佳答案

  1. 无事可做。这就是重点。
  2. 无论isBlackjack返回的是None还是Some,在这两种情况下都必须返回获胜者。无论哪种方式,您都必须返回一个State[Deck, Player]。例如,您可以通过 Option 上的 fold 来实现它,通过 pure 映射成功案例:

    def program(gamerName:String): State[Deck, Player] = for {
    gamer <- gamerTakesTwoCards(gamerName)
    dealer <- dealerTakesTwoCards
    winner <- isBlackjack(gamer, dealer).fold(for {
    gamerFinal <- gamerDrawsCards(gamer)
    dealerFinal <- dealerDrawsCards(dealer, gamerFinal)
    winnerFinal = determineWinner(gamerFinal, dealerFinal)
    } yield winnerFinal)(State.pure[Deck, Player])
    } yield winner

关于scala - 将状态单子(monad)结果从程序中的一个步骤传递到另一个步骤+提前停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56566454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com