Haskell 有条件地修改镜头的目标
如果游戏规则允许移动,我有一个功能,可以根据输入和棋盘生成更新的棋盘:Haskell 有条件地修改镜头的目标,haskell,haskell-lens,lenses,Haskell,Haskell Lens,Lenses,如果游戏规则允许移动,我有一个功能,可以根据输入和棋盘生成更新的棋盘: move :: Input -> Board -> Maybe Board 棋盘包装在游戏状态类型中,带有一些附加数据: type GameState = (Board, ...) 现在,如果move产生值,我想使用镜头在游戏状态下更新棋盘。 我可以使用助手函数来完成此操作: updateGameState :: Input -> GameState -> GameState updateGame
move :: Input -> Board -> Maybe Board
棋盘包装在游戏状态
类型中,带有一些附加数据:
type GameState = (Board, ...)
现在,如果move
产生值,我想使用镜头在游戏状态下更新棋盘。
我可以使用助手函数来完成此操作:
updateGameState :: Input -> GameState -> GameState
updateGameState input gs = gs & _1 %~ (f $ move input)
where
f g x = maybe x id (g x)
但是,我想知道是否有一个组合子可以修改
Lens
仅当提供的函数返回一个Just
时。我找到了?~
操作符,但它在左侧处理偏好
有没有一个(可能更通用的)组合词可以实现这一点,或者有没有另一种方法可以用简洁和惯用的方式表达这一点?您可以这样做
import Control.Applicative
import Data.Maybe
updateGameState :: Input -> GameState -> GameState
updateGameState input = fromMaybe <*> _1 (move input)
-- updateGameState x s = fromMaybe s $ _1 $ move x
导入控件。应用程序
导入数据,也许吧
updateGameState::输入->游戏状态->游戏状态
updateGameState输入=fromMaybe_1(移动输入)
--updateGameState x s=fromS$\u 1$move x
这使用了这样一个事实,Lens s t a b
是所有f的类型别名。函子f=>(a->f b)->(s->f t)
,因此我们可以选择使用Maybe
作为f
,并获得类型为GameState->Maybe GameState
的函数,谢谢。(>)r
的应用程序的实例和这个来自maybe f
的习惯用法就是我一直在寻找的。