用户界面 - Haskell简单的GUI程序:"can't match X against Maybe X"



你好,我是haskell 的创始人

我正在制作的GUI程序

  1. 打开文件选择对话框

  2. 接受单词

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

  4. 找到的打印编号以标记

但我遇到了一个错误,我无法解决它

我在这里粘贴错误和代码

有人能帮帮我吗?

谢谢

完整的代码在这里

--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

fileChooserGetFilename不能总是返回文件名(例如,用户可能会单击"取消")。因此,它的返回类型是Maybe FilePath,而不是FilePath。因此,如果选择了一个文件,它将返回一个包含FilePathJust。如果没有选择任何文件,则返回Nothing

然而,readFileFilePath作为自变量,而不是Maybe FilePath(用Nothing调用readFile毫无意义)。

所以你需要做的是在targetFile上进行模式匹配。如果它是Nothing,您需要以某种方式处理它(您可以打印一条错误消息,或者一直向用户询问一个文件,直到他选择一个),如果它是一个Just,您需要获取它包含的FilePath并将其提供给readFile

相关内容

  • 没有找到相关文章

最新更新