2015-04-10 2 views
0

Я хочу опробовать пакет threepenny-gui для haskell. Так я бегуПолучение ошибок при попытке тестирования threepenny-gui

cabal install threepenny-gui 

... без каких-либо проблем

Так я попробовал следующий пример:

module Main where 

import qualified Graphics.UI.Threepenny as UI 
import     Graphics.UI.Threepenny.Core 

main :: IO() 
main = do 
    startGUI defaultConfig setup 

setup :: Window -> IO() 
setup window = do 
    return window # set UI.title "Hello World!" 

    button <- UI.button # set UI.text "Click me!" 
    getBody window #+ [element button] 

    on UI.click button $ const $ do 
     element button # set UI.text "I have been clicked!" 

, но я получаю ошибки о типах:

threePennyHelloWorld.hs:8:28: 
    Couldn't match type `IO()' with `UI()' 
    Expected type: Window -> UI() 
     Actual type: Window -> IO() 
    In the second argument of `startGUI', namely `setup' 
    In a stmt of a 'do' block: startGUI defaultConfig setup 

threePennyHelloWorld.hs:12:25: 
    Couldn't match type `UI Window' with `IO a0' 
    Expected type: UI Window -> IO a0 
     Actual type: UI Window -> UI Window 
    In the second argument of `(#)', namely `set title "Hello World!"' 
    In a stmt of a 'do' block: return window # set title "Hello World!" 

threePennyHelloWorld.hs:14:31: 
    Couldn't match type `UI Element' with `IO Element' 
    Expected type: UI Element -> IO Element 
     Actual type: UI Element -> UI Element 
    In the second argument of `(#)', namely `set text "Click me!"' 
    In a stmt of a 'do' block: 
     button <- UI.button # set text "Click me!" 

threePennyHelloWorld.hs:15:9: 
    Couldn't match type `UI' with `IO' 
    Expected type: IO Element 
     Actual type: UI Element 
    In a stmt of a 'do' block: getBody window #+ [element button] 
    In the expression: 
     do { return window # set title "Hello World!"; 
      button <- UI.button # set text "Click me!"; 
      getBody window #+ [element button]; 
      on UI.click button 
      $ const $ do { element button # set text "I have been clicked!" } } 
    In an equation for `setup': 
     setup window 
      = do { return window # set title "Hello World!"; 
       button <- UI.button # set text "Click me!"; 
       getBody window #+ [element button]; 
       .... } 

threePennyHelloWorld.hs:17:9: 
    Couldn't match type `UI' with `IO' 
    Expected type: IO() 
     Actual type: UI() 
    In a stmt of a 'do' block: 
     on UI.click button 
     $ const $ do { element button # set text "I have been clicked!" } 
    In the expression: 
     do { return window # set title "Hello World!"; 
      button <- UI.button # set text "Click me!"; 
      getBody window #+ [element button]; 
      on UI.click button 
      $ const $ do { element button # set text "I have been clicked!" } } 
    In an equation for `setup': 
     setup window 
      = do { return window # set title "Hello World!"; 
       button <- UI.button # set text "Click me!"; 
       getBody window #+ [element button]; 
       .... } 

, даже когда я пытаюсь запустить пример File, я получаю те же ошибки

Есть ли у кого-нибудь идеи, что я делаю неправильно?

+1

Вся ошибка просто говорю, что «Вы написали' IO() ', но вы имели в виду 'UI()'. – AJFarmar

ответ

8

установка в UI монады, а не IO, поэтому изменить объявление типа:

setup :: Window -> UI() 

Как, например, в https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/samples/BarTab.hs

+0

большое спасибо ... сейчас я чувствую себя глупо. Я должен был это увидеть, но так как я написал его после учебника, я был немного смущен. – Xlaech