gpt4 book ai didi

haskell - 中断 MonadState 中冗长的纯计算

转载 作者:行者123 更新时间:2023-12-03 23:30:42 25 4
gpt4 key购买 nike

我无法掌握中断对 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 中做类似事情的所有尝试都失败了。无论如何,它似乎更复杂,因为异步线程不会立即返回。它一直等到计算结果。出于某种原因,当纯计算“阻塞”时,我无法终止它。

有什么线索吗?

PS。我的用例太添加了在使用 jupyter 制作的自定义 Jupyter 内核中中止计算的能力包裹。评估用户输入的函数正好在 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/

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