0

我正在尝试解决 Haskell 为相同参数提供不同输出的问题。有人已经建议这可能是与线程相关的问题。

我设法重写了一个简单的函数来使用原子版本,但更复杂的函数我需要帮助。

这是我的代码:

timeFun globalModel canvas = modifyIORef' globalModel (updateGlobalModel Tick) >> Gtk.widgetQueueDraw canvas >> return True

我的发现

按照建议,我尝试使用 do 表示法重写函数:

timerFun g c = do
  i <- readIORef g
  writeIORef g (updateGlobalModel Tick i)
  Gtk.widgetQueueDraw c
  return True

使用原子代码和 do 表示法的版本:

timerFun g c = do
  atomicModifyIORef' g $ \p -> do
    (updateGlobalModel Tick p ,())
  Gtk.widgetQueueDraw c
  return True
4

1 回答 1

1

解决问题的关键是使用 do 符号重写函数。

timerFun g c = do
  i <- readIORef g
  writeIORef g (updateGlobalModel Tick i)
  Gtk.widgetQueueDraw c
  return True

此时我已经将 writeIORef 与其他函数分开,因此使用 atomicModifyIORef' 重写它是微不足道的。

timerFun g c = do
  atomicModifyIORef' g $ \p -> 
    (updateGlobalModel Tick p, ())
  Gtk.widgetQueueDraw c
  return True

相同的功能,语法糖更少

timerFun g c = (atomicModifyIORef' g (\p -> (updateGlobalModel Tick p, ()))) >>
  Gtk.widgetQueueDraw c >>
  return True
于 2018-05-20T19:43:05.690 回答