Scala 在程序中将状态单子结果从一个步骤传递到另一个步骤+;早停

Scala 在程序中将状态单子结果从一个步骤传递到另一个步骤+;早停,scala,functional-programming,monads,scala-cats,for-comprehension,Scala,Functional Programming,Monads,Scala Cats,For Comprehension,我有以下步骤: 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):

我有以下步骤:

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
  }
  • 无事可做。这就是重点
  • 无论
    isBlackjack
    是返回
    None
    还是
    Some
    ,您都必须在这两种情况下返回一个赢家。无论哪种方式,您都必须返回一个
    状态[牌组,玩家]
    。例如,您可以使用
    选项
    上的
    折叠
    ,通过
    映射成功案例:

    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
    
    def程序(gamerName:String):状态[Deck,Player]=for{
    
    游戏玩家谢谢,因为(1)我的代码中有一个bug,让我觉得Deck没有被正确传递,但现在它工作得很好。我似乎无法想象的一件事是Deck从一个步骤转移到另一个步骤。你能分享一个链接来解释这是如何发生的吗?@jakstack是一个很好的玩具示例。a
    State[s,a]
    本质上就是
    S=>(A,S)
    ,即它采用旧状态,返回带有新状态的
    A
    。给定
    状态[S,A]
    f:A=>状态[S,B]
    ,您可以执行以下操作:从第一个状态开始
    s0
    ,并将其馈送到
    状态[S,A]
    ,该状态返回
    (A,s1)
    ,其中
    s1
    是第一个修改的状态。现在您将
    f
    应用于
    a
    ,并将更新的状态
    s1
    提供给它。这将返回a
    b:b
    和再次更新的状态
    s2
    (b,s2)
    是最后返回的结果。谢谢,这是f:a=>状态[S,b]BlackjackSteps中的一个步骤,比如gamerTakesTwoCards?@jakstack签名已经说明:
    gamerTakeTwoCards
    属于
    State[Deck,Gamer]
    ,如上所述,它本质上只是
    Deck=>(Gamer,Deck)
    的一个花哨的名字。
    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