0

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];
                 .... }

サンプルファイルを実行しようとしても、同じエラーが発生します

誰かが私が間違っていることを知っていますか?

4

1 に答える 1

8

setup は IO ではなく UI モナドにあるため、型宣言を変更します。

setup :: Window -> UI()

たとえば、https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/samples/BarTab.hsのように

于 2015-04-10T19:54:59.317 に答える