2012-08-01 75 views
0

我使用gtk2hs和glade创建了一个GUI,然后将它传递给main::IO()中的haskell代码。然后,我有一些编码的窗户标签按钮进入文本说。例如,使用gtk2hs和glade的haskell中的GUI

entry   <- xmlGetWidget xml castToEntry "entry1" 
applyButton <- xmlGetWidget xml castToButton "button1" 

然后点击applybutton

onClicked applyButton $ do 
number <- get entry entryText 

的值传递给一个变量

然后我写了一个函数的平方数是这样

sqr :: Int -> Int -> IO() 
sqr number = number * number 
后主GUI之后的

哪个不起作用!!!!!!

这应该是工作为

I/P:从用户那里得到了一些在GUI

O/P:在GUI中显示的数字广场

+0

对不起,问题在哪里? 另外,sqr不是很好的类型;你的意思是'sqr :: Int - > Int - > Int'? – 2012-08-01 08:46:17

+0

@JoachimBreitner抱歉,我之前并不清楚。希望现在很清楚...是的,我的意思是相同的... – Thenraja 2012-08-01 09:10:44

+0

也许[此IO教程](http://blog.sigfpe.com/2007/11/io-monad-for-people-who-simply -dont.html)或许多[monad]中的一个(http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html)[教程](http:// www.haskell.org/haskellwiki/All_about_monads)将是一个很好的下一步。 – 2012-08-01 09:19:42

回答

1

嗯,看来你将IO和计算部分混合在一起。

你有一个纯函数来完成你所需要的计算,像这样:

sqr :: Int -> Int -> Int 
sqr number = number * number 

而你需要通过发出一个IO动作,即更新GUI元素的状态对事件作出反应。我假设你正试图将该值输入到相同的条目中。

onClicked applyButton $ do 
    num_str <- entryGetText entryText 
    let number = read num_str 
     squared = sqr number 
    entrySetText entryText (show squared) 

请采取注意,用绳子entryGetText /的setText工作,所以你需要转换和从INTS。

+0

感谢您的指导。我有**编译错误:不在范围内'applyButton'**我已经在IO中声明了applybutton,entrytext和其他元素。然后在sqr函数中,我已经完成了你所提到的计算部分 – Thenraja 2012-08-02 06:59:51

+0

没有看到代码很难说明原因(提示:使用pastebin),但仔细检查标识符拼写,记住,Haskell区分大小写。另外,确保onClicked处理程序低于initialButton绑定。 – 2012-08-03 17:45:16

+0

我检查了我的代码并尝试使用pastebin。仍然无法弄清楚...我可以在这里粘贴我的代码吗? – Thenraja 2012-08-08 18:25:34