2015-10-20 55 views
1

我在Haskell和使用Chart模块。 在活动的GTK窗口中没有渲染文档。所以我tryed我自己:图Gtk渲染失败

import Graphics.Rendering.Chart.Easy 
import Graphics.Rendering.Chart.Gtk 

signal :: [Double] -> [(Double,Double)] 
signal xs = [ (x,(sin (x*3.14159/45) + 1)/2 * (sin (x*3.14159/5))) | x <- xs ] 

main = renderableToWindow def 300 300 $ do 
    layout_title .= "Amplitude Modulation" 
    setColors [opaque blue, opaque red] 
    plot (line "am" [signal [0,(0.5)..400]]) 
    plot (points "am points" (signal [0,7..400])) 

但是,这是不正确的,造成ghc -o main main.hs回报:

[1 of 1] Compiling Main    (main.hs, main.o) 

main.hs:7:8: 
    Couldn't match expected type ‘Control.Monad.Trans.State.Lazy.StateT 
            (Layout Double Double) 
            (Control.Monad.Trans.State.Lazy.State CState) 
            () 
            -> t’ 
       with actual type ‘IO()’ 
    Relevant bindings include main :: t (bound at main.hs:7:1) 
    The first argument of ($) takes one argument, 
    but its type ‘IO()’ has none 
    In the expression: 
     renderableToWindow def 300 300 
     $ do { layout_title .= "Amplitude Modulation"; 
      setColors [opaque blue, opaque red]; 
      plot (line "am" [signal [0, (0.5) .. 400]]); 
      plot (points "am points" (signal [0, 7 .. 400])) } 
    In an equation for ‘main’: 
     main 
      = renderableToWindow def 300 300 
      $ do { layout_title .= "Amplitude Modulation"; 
        setColors [opaque blue, ....]; 
        plot (line "am" [signal ...]); 
        .... } 

所以现在我的问题:如何做出正确的GTK渲染?

回答

2

renderableToWindow有型......

renderableToWindow :: Renderable a -> Int -> Int -> IO() 

...所以它不走EC计算你试图传递的最后一个参数。我相信最简单的解决方案是使用toWindow,这将默认状态运行EC计算,其结果转换为Renderable,并把它传递给renderableToWindow

toWindow :: (Default r, ToRenderable r) => Int -> Int -> EC r() -> IO()

main = toWindow 300 300 $ do 
    layout_title .= "Amplitude Modulation" 
    setColors [opaque blue, opaque red] 
    plot (line "am" [signal [0,(0.5)..400]]) 
    plot (points "am points" (signal [0,7..400])) 
+0

谢谢!完美解决方案 –