【发布时间】:2023-03-12 23:00:01
【问题描述】:
在尝试将 Haskell 用于图形应用程序时,我在让 GUI 以急切的方式进行评估时遇到了很多麻烦。
例如,我有时会尝试在程序的某处创建小部件,将其打包并发送给我程序的其他组件。
这效果不太好,通常不会导致小部件显示,因为延迟评估会在小部件有机会显示在屏幕上之前丢弃小部件。
所以我想知道,除了放入一堆 seq 和其他变体来鼓励热切评估之外,可以/如何处理这个问题?
我已经搜索了答案,但实际上找不到与这一系列问题相关的任何内容。
编辑:示例代码
下面的代码产生了一个空窗口。
{-# LANGUAGE RecursiveDo #-}
-- allows recursive do notation
-- mdo
-- ...
import Control.Monad
import Control.Monad.IO.Class
import qualified Data.Map.Strict as Map
import qualified Data.List as List
import System.Random
import Graphics.UI.WX hiding (Event)
import Graphics.UI.WXCore as WXCore
import Reactive.Banana
import Reactive.Banana.WX
boardWidth, boardHeight :: Int
boardWidth = 41
boardHeight = 81
main :: IO ()
main = start tetris
tetris = do
ff <- frame [text := "Tetris"
,bgcolor := white
,resizeable:= False]
p <- panel ff []
set ff [ layout := minsize (sz 100 100) $ widget p]
pps <- return $ Map.fromList $ map (\l@(x,y) -> (l, button p []))
[(x,y) | x <- [1..(boardWidth `div` 2)], y <- [1..(boardHeight `div` 2)]]
-- p <- pps Map.! (1,2)
d <- return $ map (\(x,y_m) -> y_m >>= (\y -> set ff [ color := white, layout := minsize (sz 300 300) $ widget y ])) $ Map.toList pps
-- let networkDescription :: Moment IO ()
return ff
p <- pps Map.! (1,2) 行导致 1、2 处的磁贴显示不正确。
【问题讨论】:
-
这听起来像是误诊但没有任何代码我们无能为力。我建议你制作一个 MCVE。
-
你说,“除了放一堆
seq,如何处理这个问题?”。您是否验证过放入一堆seq确实可以解决这个问题? -
我现在无法写出完整的答案;无论如何,这里的主要问题是您实际上并没有运行将按钮添加到框架的
IO操作。您可能希望在列表中使用traverse,而不是map和return。
标签: user-interface haskell lazy-evaluation