0

我正在尝试将 Haskell 程序转换为 Haskell GUI 程序,但由于我是 Haskell 的新手,每次尝试时都会遇到很多错误。我在 Stack Overflow 上多次询问过这个程序,但每当错误消失时,就会出现两个错误。

很抱歉问了类似的问题,但我打算转换的程序的能力是非常简单的单词搜索。接收输入字符串,搜索单词,在窗口上打印。

任何建议、提示或示例都会对我很有帮助。

我在 Windows XP 上。很抱歉代码很差。

--GUI routine
import Graphics.UI.Gtk
import Text.Regex.Posix ((=~))
import Control.Monad (when)
--core routine
matchWord :: String -> String -> Int
matchWord file word = length . filter (== word) . concat $ file =~ "[^- \".,\n]+"

--main start
main :: IO ()
main =
      do initGUI
         win <- windowNew
         windowSetTitle win "WORD SEARCHER"
         win `onDestroy` mainQuit

         fch <- fileChooserWidgetNew FileChooserActionOpen
         containerAdd win fch 

         targetFile <- fileChooserGetFilename fch --wrong?

         ent <- entryNew
         btn <- buttonNewWithLabel "Click to search"
         st <- labelNew $ Just "Found : 0      "

         col <- vBoxNew False 5
         containerAdd col ent
         containerAdd col btn
         containerAdd col st    

         btn `onClicked` do targetWord <- entryGetText ent
                            fileData <- readFile Just targetFile
                            found <- matchWord fileData targetWord
                            labelSetText st found
         containerAdd win col
         widgetShowAll win
         mainGUI

谢谢你的阅读

4

1 回答 1

1

这会让你开始。

targetFile <- fileChooserGetFilename fch

此时,targetFile有类型Maybe String;也就是说,它将返回Just "somestring"or Nothing。你想要这"somestring"部分,如果有的话。您可以通过模式匹配获得它:

Just targetFile <- fileChooserGetFilename fch

fileChooserGetFilename如果返回的结果,这将失败并显示不透明的错误消息Nothing。为了更加稳健,您可以对结果进行案例分析:

maybeTargetFile <- fileChooserGetFilename fch
targetFile <- case maybeTargetFile of
                  Nothing -> fail "I need a filename!"
                  Just file -> return file

另一个问题在这一行:

found <- matchWord fileData targetWord

x <- m用于将动作的结果绑定m到变量x中,但matchWord返回一个Int,而不是一个动作(例如IO a对于 some a)。

于 2011-06-11T09:24:11.400 回答