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是一个很好的玩具示例。aState[s,a]
本质上就是S=>(A,S)
,即它采用旧状态,返回带有新状态的A
。给定状态[S,A]
和f:A=>状态[S,B]
,您可以执行以下操作:从第一个状态开始s0
,并将其馈送到状态[S,A]
,该状态返回(A,s1)
,其中s1
是第一个修改的状态。现在您将f
应用于a
,并将更新的状态s1
提供给它。这将返回ab: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