你好我是哈斯克尔的初学者
我正在制作GUI程序
打开文件选择对话框
取词
搜索所选txt文件中的单词
打印发现标签号
但我遇到了无法解决的错误
我在这里粘贴错误和代码
有人可以帮助我吗?谢谢
完整的代码在这里
--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
答案 0 :(得分:3)
fileChooserGetFilename
无法始终返回文件名(例如,用户可能会点击“取消”)。因此,其返回类型为Maybe FilePath
,而非FilePath
。因此,如果选择了某个文件,则会返回包含Just
的{{1}}。如果未选择任何文件,则返回FilePath
。
但是Nothing
需要readFile
作为参数,而不是FilePath
(使用Maybe FilePath
调用readFile
毫无意义。)
所以你需要做的是你需要在Nothing
上进行模式匹配。如果它是targetFile
,你需要以某种方式处理(你可以打印一条错误信息,或者只是一直询问用户输入文件),如果是Nothing
,你需要它包含的Just
并将其提供给FilePath
。