Простая программа с графическим интерфейсом на Haskell: «не могу сопоставить X с Maybe X» - PullRequest
3 голосов
/ 11 июня 2011

Привет, я очень новичок в haskell

Я создаю программу с графическим интерфейсом, которая

  1. открывает диалог выбора файла

  2. взять слово

  3. поиск слова в выбранном текстовом файле

  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

1 Ответ

3 голосов
/ 11 июня 2011

fileChooserGetFilename не всегда может вернуть имя файла (например, пользователь может нажать «отменить»).По этой причине его тип возвращаемого значения Maybe FilePath, а не FilePath.Таким образом, если файл был выбран, он возвращает Just, содержащий FilePath.Если файл не был выбран, он возвращает Nothing.

Однако readFile принимает в качестве аргумента FilePath, а не Maybe FilePath (вызов readFile с Nothing не имеет смысла).

Итак, вам нужно сопоставить шаблон с targetFile.Если это Nothing, вам нужно как-то с этим справиться (вы можете напечатать сообщение об ошибке или просто продолжать запрашивать файл у пользователя, пока он его не выберет), а если это Just, вы берете FilePathон содержит и передает это readFile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...