gpt4 book ai didi

user-interface - Haskell 简单 GUI 程序 : "can' t match X against Maybe X"

转载 作者:行者123 更新时间:2023-12-04 06:41:33 24 4
gpt4 key购买 nike

你好我是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(调用 readFileNothing 没有任何意义)。

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

关于user-interface - Haskell 简单 GUI 程序 : "can' t match X against Maybe X",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6314310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com