【发布时间】:2014-08-15 06:52:13
【问题描述】:
我在 Haskell 中的速度非常缓慢,试图获得一个可用的 gui 工具等。我遵循了关于使用 glade 创建一个简单的 GUI 应用程序的基本教程,现在我正在尝试对其进行模块化。特别是,我想利用函数而不是在 main.js 中做所有事情。我做的第一件事是创建单独的函数来访问按钮并关联单击按钮时要执行的代码。它工作正常,但如果您查看下面的代码,我必须随身携带整个 glade XML“变量”。我意识到我们在 Haskell 中不做全局,但在我看来,必须有一个更好的机制,而不是在函数中携带每一个变量。显然,在 OO 世界中,XML 内容只是类中的一个实例变量,因此无处不在。在 Haskell 世界中执行此操作的“正确”方法是什么?
module Main (main) where
import Graphics.UI.Gtk
import Graphics.UI.Gtk.Glade
getButton :: GladeXML -> String -> IO Button
getButton gladeXML buttonName =
xmlGetWidget gladeXML castToButton buttonName
onButtonClick :: GladeXML -> String -> [IO a] -> IO ()
onButtonClick gladeXML buttonName codeSequence = do
aButton <- getButton gladeXML buttonName
_ <- onClicked aButton $ do -- Run the sequence of operations when user clicks
sequence_ codeSequence
return ()
loadGladeFile :: FilePath -> IO (Maybe GladeXML)
loadGladeFile filename = do
g <- xmlNew filename
return g
main :: IO ()
main = do
_ <- initGUI -- Setup
-- Load the Glade XML file
Just xml <- loadGladeFile "tutorial.glade"
-- Create main window (everything inside will be created too)
window <- xmlGetWidget xml castToWindow "window1"
-- Define what to do when we quit
_ <- onDestroy window mainQuit
-- Show the wondow
widgetShowAll window
-- Associate an onClick event with a button
onButtonClick xml "button1" [putStrLn "Hello, world"]
-- Off we go
mainGUI
【问题讨论】:
-
您可以将所需的所有内容都粘贴到记录中并传递。或者使用 reader monad 来避免传递它。
-
@David 如果您确实使用唱片,您可能想试一试 Jon Sterling 的黑胶唱片 (jonmsterling.com/posts/…)。我自己没有尝试过,但听说他们解决了记录的命名空间问题 (ghc.haskell.org/trac/ghc/wiki/Records)
-
我仍在尝试围绕基础知识。到目前为止,我最大的问题是在 Haskell 中实现过去对我来说微不足道的事情(使用 Delphi、C++、Python、Objective-C、Smalltalk 等语言)似乎非常复杂。虽然我开始从概念上理解这个 Reader Monad 发生了什么,但它似乎是解决一个非常简单问题的一种非常复杂的方法。绕过函数式编程的“纯粹性”所需的机制非常复杂。