繁体   English   中英

带有fclabels的STM

[英]STM with fclabels

我构建了一个小型游戏引擎来管理一块棋盘(目前用于玩Conway的生活游戏)。 可通过fclabels和State通过镜头访问所有数据。 该引擎将用户输入和图形渲染(通常是游戏循环)结合在一起。

帧之间的计算有时可能很慢且执行时间很长。 因此,我想使用并发管理STMTVar来管理正方形。

我的数据当前表示为:

data World = World {
    … -- window configuration, not important
    , _squares :: TVar [Square]
}

mkLabels [''World] -- creates labels, similar to mkLenses

我的功能在Game Monad中运行,其定义如下:

type Game a = StateT World IO a

使用标签单字版本 我在monad中使用Getters&Setters。

我想知道是否可以通过某种方式编写行为如下的新标签:

gets :: MonadState f m => Lens (->) f o -> m o 
…
puts :: MonadState f m => Lens (->) f o -> o -> m () 

但这要照顾STM(获取将涉及readTVar,放置将涉及writeTvar等)。

如果我理解正确的话,你要定义一个镜头tlens ST:

gets tlens

是相同的:

do tvar <- gets squares
   sqs <- liftIO $ atomically $ readTVar tvar
   return sqs

puts tlens sqs位置与以下位置相同:

do tvar <- gets squares
   liftIO $ atomically $ writeTVar tvar sqs 

我认为可以通过查看gets的类型来回答:

gets :: MonadState f m => Lens (->) f o -> m o

镜头参数是纯参数,不是单声道。 要了解TVar的内容,您需要在IO-monad中运行代码。

此外,Data.Label.Monadic中的gets的定义是(链接)为:

gets lens = State.gets (Total.get lens)

其中State是Control.Monad.State,Total是Data.Label.Total。

State.gets需要一个纯粹的功能,所以你又不是要能够创建一个镜头,将与gets

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM