Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 有条件地修改镜头的目标_Haskell_Haskell Lens_Lenses - Fatal编程技术网

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
习惯用法就是我一直在寻找的。