- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在写一个简单的游戏——俄罗斯方 block 。这是我有生以来第一次使用函数式编程来实现这个目标,我选择了 Haskell 作为一门语言。然而,我被 OOP 和命令式思维所污染,并且害怕无意识地将这种思维方式应用到我的 Haskell 程序中。
在我的游戏中,我需要了解耗时(计时器)和按下/按下键(键盘)的信息。翻译成 Haskell 的 SDL 类(class)中使用的方法如下所示:
主文件
data AppData = AppData {
fps :: Timer
--some other fields
}
getFPS :: MonadState AppData m => m Timer
getFPS = liftM fps get
putFPS :: MonadState AppData m => Timer -> m ()
putFPS t = modify $ \s -> s { fps = t }
modifyFPSM :: MonadState AppData m => (Timer -> m Timer) -> m ()
modifyFPSM act = getFPS >>= act >>= putFPS
data Timer = Timer {
startTicks :: Word32,
pausedTicks :: Word32,
paused :: Bool,
started :: Bool
}
start :: Timer -> IO Timer
start timer = SdlTime.getTicks >>= \ticks -> return $ timer { startTicks=ticks, started=True,paused=False }
isStarted :: Timer -> Bool
isStarted Timer { started=s } = s
modifyFPSM $ liftIO . start
.这使得 Timer 有点纯粹(它不是明确的 monad,它的函数返回 IO 只是因为它需要测量时间)。但是,这会在 Timer 模块之外的代码中添加 getter 和 setter。
data KeyboardState = KeyboardState {
keysDown :: Set SDLKey, -- keys currently down
keysPressed :: Set SDLKey -- keys pressed since last reset
};
reset :: MonadState KeyboardState m => m ()
reset = get >>= \ks -> put ks{keysPressed = Data.Set.empty}
keyPressed :: MonadState KeyboardState m => SDLKey -> m ()
keyPressed key = do
ks <- get
let newKeysPressed = Data.Set.insert key $ keysPressed ks
let newKeysDown = Data.Set.insert key $ keysDown ks
put ks{keysPressed = newKeysPressed, keysDown = newKeysDown}
keyReleased :: MonadState KeyboardState m => SDLKey -> m ()
keyReleased key = do
ks <- get
let newKeysDown = Data.Set.delete key $ keysDown ks
put ks{keysDown = newKeysDown}
最佳答案
大多数程序都有一些状态概念。让您不用担心每次使用State
monad 以某种方式形成或形成。它仍然是纯粹的功能,因为你本质上是在写
Arg1 -> Arg2 -> State -> (State, Result)
modify
将它们注入(inject)状态单子(monad)。
reset :: KeyBoard -> KeyBoard
keyPressed :: Key -> KeyBoard -> KeyBoard
...
do
nextKey <- liftIO $ magic
modify $ keyPressed nextKey
关于oop - Haskell - 状态单子(monad)是命令式思维的标志吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20803322/
我是 hadoop mapreduce 框架领域的新手。自己看了很多教程,了解了框架。我已经在伪分布式模式下成功配置了一个 hadoop 设置。我有两个特定任务需要在 Hadoop MapReduce
我在我的Rails应用程序中实现了 sphinx 搜索。 我想模糊搜索。它应该搜索拼写错误,例如,如果输入搜索查询charact * a * ristics,则应该搜索charact * e * ri
我正在和会思考的 sphinx 一起工作 define_index do indexes to indexes created_on has c
我正在尝试在我的 Rails 3 应用程序中设置 Thinking sphinx。我设置了mysql并安装了sphinx没有错误。在我的 gemfile 中有 gem "riddle", "~> 1.
我有一个带有 ui-bootstrap 日期选择器的表单。我想防止日期成为过去。 我将指令的 min-date 设置为 new Date()如下所示。这可以正确地防止在使用弹出窗口时选择过去的日期,但
我对 Sphinx 还很陌生。 尝试查找名称为“bob”且 company_id 为“14”的用户。 Controller: @users = User.search 'bob', :conditio
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!