在尝试测试threepenny-gui时出错

Xla*_*ech 0 haskell threepenny-gui

我想试试hasckell的threepenny-gui包.所以我跑了

cabal install threepenny-gui
Run Code Online (Sandbox Code Playgroud)

......没有任何问题

所以我尝试了以下示例:

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!"
Run Code Online (Sandbox Code Playgroud)

但是我得到了关于类型的错误:

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];
                 .... }
Run Code Online (Sandbox Code Playgroud)

即使我尝试运行示例文件,我也会得到相同的错误

有谁知道我做错了什么?

JP *_*mau 8

setup是在UI monad中,而不是IO,所以更改类型声明:

setup :: Window -> UI()
Run Code Online (Sandbox Code Playgroud)

例如在https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/samples/BarTab.hs中