- 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/
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正在做一个相当简单的示例来学习如何使用 ocaml 作为命令式语言。我的猜测是我搞乱了分号,但我在代码中找不到任何错误 let sort array = for index = 0 to (Arra
我是函数式编程的新手,我刚遇到一些事情,想知道是否有解决办法。 假设我有 myArray = [ { a : 1 } { a : 4 } { a : 5 } { a : 6 } {
我正在尝试在我的 Node 应用程序的 dockerode 容器中编译并执行 java 程序。我可以通过首先使用基本 javascript 写入 tmp.java 文件,然后运行以下 shell 命令
Quicksort 通常被描述为一种原位(就地)算法,尽管它需要 O(log n) 堆栈空间。那么 in situ 是否意味着“需要少于 O(n) 的额外空间”,或者堆栈空间通常不算作空间复杂度(但为
我需要一些关于 Reactive JS 和“if 语句”的帮助 我不知道如何在 Reactive JS 中实现一个简单的代码在 Spark AR 中是这样的: if( boolvalue=true)
我是 Scala 的新手,我正在尝试从 IndexedSeq 创建一个大 map ,我在 SO 上发现了一个提及,即函数式 map 创建比命令式 Java map 创建慢得多,我决定自己测试一下。到目
我是一名优秀的程序员,十分优秀!