你好,我是haskell 的创始人
我正在制作的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
fileChooserGetFilename
不能总是返回文件名(例如,用户可能会单击"取消")。因此,它的返回类型是Maybe FilePath
,而不是FilePath
。因此,如果选择了一个文件,它将返回一个包含FilePath
的Just
。如果没有选择任何文件,则返回Nothing
。
然而,readFile
将FilePath
作为自变量,而不是Maybe FilePath
(用Nothing
调用readFile
毫无意义)。
所以你需要做的是在targetFile
上进行模式匹配。如果它是Nothing
,您需要以某种方式处理它(您可以打印一条错误消息,或者一直向用户询问一个文件,直到他选择一个),如果它是一个Just
,您需要获取它包含的FilePath
并将其提供给readFile
。