2

在另一个自学ekmett 镜头库的尝试中,我正在修改一个简单的基于文本的刽子手游戏,以使用镜头而不是记录更新。代码本身有效,但我遇到了一个地方,我觉得我使用镜头库不正确。这段代码可以正常工作,但它对我来说并不像我见过的所有镜头教程那样优雅。

首先,我的类型:

data GameState = GameState
    { _guess :: Set Char
    , _secret :: String
    , _wrongGuesses :: Int
    } deriving (Eq, Show)

makeLenses ''GameState

type Game a = StateT GameState IO a

我困扰的功能是我处理从用户那里获得的猜测:

nextGuess :: Game ()
nextGuess = do
    gs <- get  -- GameState
    g <- getUserGuess :: Game Char
    -- If the user guessed a letter that wasn't in the secret word
    when (g `notElem` gs^.secret) $
        -- increment the number of wrong guesses
        wrongGuesses += 1
    -- Insert that guess into the set of guesses
    guess .= gs^.guess.to (insert g)

我基本上没问题

when (g `notElem` gs^.secret) $ wrongGuesses += 1

但是下一行,将猜测插入当前的猜测集似乎是一种迂回的方式。必须获取当前设置,插入,然后再次设置它听起来不像“镜头的做事方式”,特别是当我必须做的所有事情之前增加wrongGuesses计数器的行是 use += 1

有一个更好的方法吗?

4

1 回答 1

4

除非我大错特错,

guess %= insert g

(%=)充当修改并将其Set输入insert g,然后将其重新插入guess.

于 2014-04-01T03:25:30.767 回答