- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们如何让用户传递一个 eventHandler,它使用 stateMonad 但在单独的线程中调用?比如下面的例子中,应该如何调用forkIO,以便eventHandler可以调用操作呢?我是 Haskell 的新手,如果这是向用户公开的错误 api,请纠正我?
data MyTypeResult a = MyTypeValue a
data MyTypeState = MyTypeState {_counter :: Int}
newtype MyType a = MyType {
unMyType :: StateT MyTypeState IO (MyTypeResult a)
}
instance Monad MyType where
(>>=) = myTypeBind
return = myTypeReturn
fail = myTypeFail
myTypeBind = undefined
myTypeReturn = undefined
myTypeFail = undefined
type Event = String
type Handler = Event -> MyType ()
doSomethingAwesome :: MyType Event
doSomethingAwesome = undefined
operate :: String -> MyType ()
operate = undefined
start :: Handler -> MyType ()
start h = do
event <- doSomethingAwesome
--forkIO $ h event -- The line that is troubling
return ()
testHandler :: Event -> MyType()
testHandler _ = operate "abcd"
myMain = start testHandler
最佳答案
你不能让 State
计算在共享相同状态的多个线程中运行,因为在幕后,State
monad 只不过是一个通过的函数调用链链中下一个函数的状态值。
对于多线程代码,您可以将 StateT s IO
替换为 ReaderT (IORef s) IO
并使用
forkIO $ runReaderT (h event) stateVar
fork 新线程(其中 stateVar
是一个包含共享状态的 IORef
)。
在 ReaderT
堆栈中,您使用
stateVar <- ask
s <- lift $ readIORef stateVar
并更新它
stateVar <- ask
lift $ atomicModifyIORef stateVar f
其中f
是一个纯函数,它获取当前状态并返回修改后的状态加上一个辅助结果。
如果你需要更多花哨的东西(例如使用单子(monad)函数修改状态),那么你应该使用 MVar
或 TVar
而不是 IORef
.
关于haskell - 带有 stateT 的 ForkIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18233902/
我没有在haskell中做过任何网络化的事情,所以我现在尝试一下。我使用 Oleg 的 ZFS 作为模板如何做到这一点。 IIRC 他没有使用线程,而是使用“定界延续”,所以我想知道是否也可以在不使用
我正在尝试在 Haskell 中使用并发进行特定优化,其中只需要两个值中的一个,并且根据情况,创建其中一个值可能比另一个快得多。 我想我可以只用 forkIO 运行 2 个线程,然后等到一个值放入 M
我在做基准测试 forkIO使用以下代码: import System.Time.Extra import Control.Concurrent import Control.Monad import
我试图了解协程,但考虑到 forkIO 线程的存在,我不太了解它们的目的。哪些用例需要在线程上使用协程? 最佳答案 如果您在谈论特定的 Haskell 协程实现(如果是,请添加链接),或者关于一般概念
如果我使用 forkIO 创建一个线程,我需要提供一个函数来运行并取回一个标识符(threadID)。然后我可以通过例如与这种动物交流。工作负载,MVAR 等。但是,据我了解,创建的线程非常有限,只能
我们如何让用户传递一个 eventHandler,它使用 stateMonad 但在单独的线程中调用?比如下面的例子中,应该如何调用forkIO,以便eventHandler可以调用操作呢?我是 Ha
我正在尝试让多个客户端连接到服务器。我设法做的是通过使用服务器将一个客户端连接到服务器: main = withSocketsDo $ do socket
我正在使用 Haskell 轻量级线程 ( forkIO ) 使用以下代码: import Control.Concurrent beginTest :: IO () beginTest = go
我希望有人能帮助我理解为什么下面的代码会生成下面的输出。代码来自 Simon Marlow 书中的并发章节(链接如下)。 根据对各种功能的描述,我假设第二个 putMVar鉴于 (i) 两个 putM
我不确定 Haskell 中的 forkIO/forkOS 和 forkProcess 之间有什么区别。据我了解,forkIO/forkOS 更像是线程(类似于 C 中的 pthread_create
我已经编写了下面的代码,并注意到 killThread 阻塞并且线程仍在继续。只有当我在 forkProcess 中执行此操作时才会发生这种情况,如果我删除 forkProcess,一切都会按预期进行
我正在寻找的是一个简单的类型函数: alive :: ThreadID -> IO Bool 最佳答案 这对于标准 base 是不可能的。据我所知,库,但您可以使用 GHC 特定的 API 来获取线程
我是一名优秀的程序员,十分优秀!