gpt4 book ai didi

haskell - 有条件地修改镜头的目标

转载 作者:行者123 更新时间:2023-12-03 14:07:54 26 4
gpt4 key购买 nike

如果游戏规则允许移动,我有一个函数可以从输入和棋盘生成更新的棋盘:

move :: Input -> Board -> Maybe Board

板包裹在 GameState输入一些附加数据:
type GameState = (Board, ...)

现在我想用镜头来更新游戏状态下的棋盘如果 move产量 Just一个值。
我可以使用辅助函数来做到这一点:
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

这使用了 Lens s t a b 的事实。是 forall f . Functor f => (a -> f b) -> (s -> f t) 的类型别名,所以我们可以选择使用 Maybef并获得 GameState -> Maybe GameState 类型的函数.

关于haskell - 有条件地修改镜头的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27991268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com