如何重用Haskell链中的中间值?

时间:2015-06-10 04:16:22

标签: haskell binding bind chain

我确信这已经得到了解答,但显然我不知道该搜索什么。

我正在研究我的第一个非平凡的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的值。我可以再次运行相同的绑定链,但我确信在上面的代码中确定值时,必须有一个更好的方法存储值。

我的问题是,是否可以存储此值。如果是这样,怎么样?

1 个答案:

答案 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一样(例如在一个元组中)。