Haskell简单的GUI程序:“无法匹配X与Maybe X”

时间:2011-06-11 05:37:05

标签: user-interface haskell

你好我是哈斯克尔的初学者

我正在制作GUI程序

  1. 打开文件选择对话框

  2. 取词

  3. 搜索所选txt文件中的单词

  4. 打印发现标签号

  5. 但我遇到了无法解决的错误

    我在这里粘贴错误和代码

    有人可以帮助我吗?

    谢谢

    完整的代码在这里

    --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 <- buttonNew
             st <- labelNew $ Just "Found : 0      "
    
             col <- vBoxNew False 5
             containerAdd col ent
             containerAdd col btn
             containerAdd col st    
    
             buttonSetLabel btn "Click to search"
    
             btn `onClicked` do targetWord <- entryGetText ent
                                fileData <- readFile targetFile
                                found <- matchWord fileData targetWord
                                labelSetText st found
             containerAdd win col
             widgetShowAll win
             mainGUI
    

    错误在这里

    gui-word-search.hs:33:49:
        Couldn't match expected type `FilePath'
           against inferred type `Maybe FilePath'
        In the first argument of `readFile', namely `targetFile'
        In a 'do' expression: fileData <- readFile targetFile
    

1 个答案:

答案 0 :(得分:3)

fileChooserGetFilename无法始终返回文件名(例如,用户可能会点击“取消”)。因此,其返回类型为Maybe FilePath,而非FilePath。因此,如果选择了某个文件,则会返回包含Just的{​​{1}}。如果未选择任何文件,则返回FilePath

但是Nothing需要readFile作为参数,而不是FilePath(使用Maybe FilePath调用readFile毫无意义。)

所以你需要做的是你需要在Nothing上进行模式匹配。如果它是targetFile,你需要以某种方式处理(你可以打印一条错误信息,或者只是一直询问用户输入文件),如果是Nothing,你需要它包含的Just并将其提供给FilePath