我确信这已经得到了解答,但显然我不知道该搜索什么。
我正在研究我的第一个非平凡的Haskell程序 - 模拟我喜欢的纸牌游戏。我的程序正在运行,但有一种情况我确信可以更好地处理。
如果我有一系列Either String TypeChangesBasedOnTheFunction
的绑定。
playerInput <- getLine
case playerInput of
{- CASE STUFF NOT IMPORTANT TO THIS QUESTION -}
_ -> do let handValue = inputHasAllValidChars playerInput >>= makeDeckFromString >>= deckSubset (getCurrentPlayersDeck gameState) >>= whatHandRepresents >>= handBeatsCurrentTopTrick
在此部分代码运行后不久,我需要whatHandRepresents
的值。我可以再次运行相同的绑定链,但我确信在上面的代码中确定值时,必须有一个更好的方法存储值。
我的问题是,是否可以存储此值。如果是这样,怎么样?
答案 0 :(得分:1)
你必须将它一直回到你需要的地方。
repr <- case playerInput of
-- now you have to return something of the appropriate type,
-- say, `Left "didn't get it"`, from these other cases.
_ -> do let repr = ... >>= whatHandRepresents
handValue = repr >>= handBeatsCurrentTopTrick
-- use handValue
return repr
-- now use repr :: Either String HandRepresentationOrWhatever
我确实希望您在默认情况下实际使用handValue
,而不是尝试将其分配以供日后使用。它只会在这种情况下的范围内;如果你想在之后使用它,你也必须返回它,就像repr
一样(例如在一个元组中)。