在另一个自学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
。
有一个更好的方法吗?