- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法掌握中断对 SIGINT 信号的冗长纯计算的正确方法。
在下面的简单示例中,我有 slowFib
模拟冗长计算的函数。仅在 IO
中运行时monad 我可以用 C-c 终止它(使用 async 产生 worker )。
但是,当我将计算放入 MonadState, MonadIO
堆栈它不再起作用...另一方面,简单 threadDelay
在同一个堆栈中仍然可以终止。
代码如下:
{-# LANGUAGE FlexibleContexts #-}
module Main where
import Data.Monoid
import Control.DeepSeq
import Control.Concurrent
import Control.Concurrent.Async
import Control.Monad.State
-- import Control.Monad.State.Strict
import System.Posix.Signals
slowFib :: Integer -> Integer
slowFib 0 = 0
slowFib 1 = 1
slowFib n = slowFib (n - 2 ) + slowFib (n - 1)
data St = St { x :: Integer } deriving (Show)
stateFib :: (MonadState St m, MonadIO m) => Integer -> m Integer
stateFib n = do
let f = slowFib n
modify $ \st -> st{x=f}
return f
stateWait :: (MonadState St m, MonadIO m) => Integer -> m Integer
stateWait n = do
liftIO $ threadDelay 5000000
return 41
interruptable n act = do
putStrLn $ "STARTING EVALUATION: " <> n
e <- async act
installHandler sigINT (Catch (cancel e)) Nothing
putStrLn "WAITING FOR RESULT"
waitCatch e
main = do
let s0 = St 0
r <- interruptable "slowFib" $ do
let f = slowFib 41
f `deepseq` return ()
return f
r <- interruptable "threadDelay in StateT" $ runStateT (stateWait 41) s0
putStrLn $ show r
r <- interruptable "slowFib in StateT" $ runStateT (stateFib 41) s0
putStrLn $ show r
IO
monad)我必须强制结果。否则异步计算只会返回一个 thunk。
MonadState
中。和
MonadIO
.
最佳答案
计算似乎在 putStrLn $ show r
上被阻止,即在 interruptable
之外功能。请注意 stateFib
不强制结果,所以 async
几乎立即退出。整个工作推迟到putStrLn
尝试打印结果。尝试更早地强制计算:
stateFib :: (MonadState St m, MonadIO m) => Integer -> m Integer
stateFib n = do
let f = slowFib n
modify $ \st -> st{x=f}
f `seq` return f
关于haskell - 中断 MonadState 中冗长的纯计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46745871/
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: What's the “|” for in a Haskell class definition? 我对 Haske
我无法掌握中断对 SIGINT 信号的冗长纯计算的正确方法。 在下面的简单示例中,我有 slowFib模拟冗长计算的函数。仅在 IO 中运行时monad 我可以用 C-c 终止它(使用 async 产
据我所知 MonadState s m使我能够获取和更新 s . 然而,我不明白这种状态如何与镜头组合器中使用的状态相关,如 assign .特别是当镜头可以对多个目标进行操作时。此外,还有更简单的函
我想用修改实现放置 put :: s -> m () modify :: (s -> s) m s 当我做 put s = modify $ const((), s) 我得到错
class Monad m => MonadState s m | m -> s where -- | Return the state from the internals of the m
http://hackage.haskell.org/packages/archive/mtl/1.1.0.2/doc/html/src/Control-Monad-State-Lazy.html i
我正在阅读 Real World Haskell 中的 Monads 章节(第 14 章)。 一个函数是defined如下: type RandomState a = State StdGen a g
我查看了 MonadState source code ,我不明白为什么这3个函数不会进入死循环?如何评估这一点? class Monad m => MonadState s m | m -> s w
我正在尝试酸性状态。 documentation声明 Update st 是 MonadState st 的一个实例。我尝试了不同的事情,但我的编译器不想看到这一点:(我尝试了 examples 中的
我在进行简单的蒙特卡洛模拟时遇到了这个问题。我使用 MonadIO、MonadState 和 MonadRandom 来简化程序状态的维护。我遇到了 Count not deduce 错误,但是当我删
考虑下一个例子。我有一个 monad MyM,它只是一个 StateT {-# LANGUAGE TypeFamilies #-} import Control.Monad.State import
这个 MonadState 实例,复制自 http://book.realworldhaskell.org/read/monad-transformers.html , 给我一个 GHC 7.4.2
我正在更改一些曾经在 StateT 中运行的代码monad 在 StateP 内运行来自 Control.Proxy .但是,我的一些代码(例如 %= 中的 Control.Lens 运算符)需要一个
我刚刚发现 RWST(来自 transformers)不带有 MonadReader、MonadState 的实例,或 MonadWriter。这对我来说似乎有点奇怪,因为这些实例会立即提高可用性,例
我是一名优秀的程序员,十分优秀!