我正在尝试将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
感谢您阅读
答案 0 :(得分:1)
这将帮助您入门。
targetFile <- fileChooserGetFilename fch
此时,targetFile
的类型为Maybe String
;也就是说,它会返回Just "somestring"
或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
对某些a
)。