我想试试hasckell的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];
.... }
即使我尝试运行示例文件,我也会遇到相同的错误
有没有人知道我做错了什么?
答案 0 :(得分:8)
设置在UI monad中,而不是IO,因此更改类型声明:
setup :: Window -> UI()
例如https://github.com/HeinrichApfelmus/threepenny-gui/blob/master/samples/BarTab.hs