分离模型和GUI IO(Wx)的状态:堆栈还是FRP?

对于我的图表工具,我想保持核心模型的代码与GUI隔离。

在下面的例子中,“状态”被传递周围vDiag ,这是一个Tvar 。 这是wx中的一个设计决定。 现在,对于我的图表工具,我希望将核心模型“存储”在一个fgl图形中(其中包含复杂的类型),并且wx将仅被赋予一个视图; 在这个例子中说,绘画时读取访问点的列表,以及点击,拖动等时写入的一些函数。 我首先想到了一些Monad堆栈,但即使将StateT和来自wx的IO组合起来看起来也不是微不足道的,因为io动作遍布在回调代码中(点击,绘制...等)。 感觉就像堆栈底部的IO不再合适。

所以你如何通过一个STATE,或者它不是要走的路? (我直觉这是一个典型的例子,RFP是如何开始的?)

(在代码中,报告描绘的时候有一个点击,点的名单在通过周围的红色圆圈Tvar vDiag 。我已标记的“--fgl”里相当于国家访问会去。并建立了基本的FGL测试图我想在一个国家)(我原本试图放弃没有玻璃钢 - 反应性香蕉,了解这个问题,但我想我可能已经打了它;-)

module Main where

import Graphics.UI.WX hiding (empty)
import Data.Graph.Inductive

main
  = start ballsFrame 

ballsFrame
  = do 


  vDiag  <- varCreate [] 
  --gDiag  <- initg -- fgl
  frame  <- frame    [text := "Demo"]
  p <- panel frame []
  file   <- menuPane [text := "&File"]
  quit   <- menuQuit file [on command := close frame]

  set frame [text:= "testing", menuBar := [file] ]
  set p [on click := drawBins vDiag p , on paint := paintDiag vDiag ] 
                -- fgl pass the var around
  return ()  
    where
    drawBins  d ppanel pt = 
                do varUpdate d  (pt:) 
                    -- addpoint f g -- fgl : insert a point
                   repaint ppanel


    -- paint the balls
    paintDiag vdiag dc view
      = do  balls <- varGet vdiag  -- getPointsFromGraph 
        -- fgl : change to get the list of points
            set dc [brushColor := red, brushKind := BrushSolid] 
            mapM_ (drawDiag dc)  balls

    drawDiag dc pt
      = circle dc pt 10 []

-- basic fgl test graph accessors  I would like to put in a State and replace vDiag

initg:: Gr Point  String
initg = mkGraph [(1,pt 10 10),(2,pt 30 30)] [(1,2,"truc"), (2,1,"revtruc")]

getPointsFromGraph :: Graph gr => gr b b1 -> [b]
getPointsFromGraph g = map snd $ labNodes g
-- getPointsFromGraph initg = [Point {pointX = 10, pointY = 10},Point {pointX = 30, pointY = 30}]

addpoint :: DynGraph gr => a -> gr a b -> gr a b
addpoint p g = -- add a point p into graph p
               insNode (4,p) g
链接地址: http://www.djcxy.com/p/58761.html

上一篇: Separating State for a Model and GUI IO ( Wx) : Stack or FRP?

下一篇: traversal tree with Lens and Zippers