конвертировать TUI в GUI в haskell - PullRequest
0 голосов
/ 11 июня 2011

Я пытаюсь преобразовать программу на Haskell в программу с графическим интерфейсом на Haskell, но, поскольку я очень новичок в Haskell, каждый раз, когда я что-то пробую, я получаю много ошибок.Я много раз спрашивал об переполнении стека для этой программы, но всякий раз, когда ошибка исчезает, возникают две ошибки.

Извините, что задаю подобный вопрос, но способность программы, которую я собираюсь преобразовать, - очень простой поиск слов.Получите строку ввода, найдите слово, напечатайте в окне.

Любой совет, подсказка или пример был бы очень полезен для меня.

Я на Windows XP.Извините за очень плохой код.

--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 <- buttonNewWithLabel "Click to search"
         st <- labelNew $ Just "Found : 0      "

         col <- vBoxNew False 5
         containerAdd col ent
         containerAdd col btn
         containerAdd col st    

         btn `onClicked` do targetWord <- entryGetText ent
                            fileData <- readFile Just targetFile
                            found <- matchWord fileData targetWord
                            labelSetText st found
         containerAdd win col
         widgetShowAll win
         mainGUI

спасибо за чтение

1 Ответ

1 голос
/ 11 июня 2011

Это поможет вам начать.

targetFile <- fileChooserGetFilename fch

На данный момент, targetFile имеет тип Maybe String; то есть он вернет либо Just "somestring", либо Nothing. Вам нужна часть "somestring", если она доступна. Вы можете получить это путем сопоставления с образцом:

Just targetFile <- fileChooserGetFilename fch

Это приведет к ошибке с непрозрачным сообщением об ошибке, если результат fileChooserGetFilename вернет Nothing. Для большей надежности вы можете проанализировать результат:

maybeTargetFile <- fileChooserGetFilename fch
targetFile <- case maybeTargetFile of
                  Nothing -> fail "I need a filename!"
                  Just file -> return file

Другая проблема в этой строке:

found <- matchWord fileData targetWord

x <- m используется для привязки результата действия m к переменной x, но matchWord возвращает Int, а не действие (например, IO a для некоторых a) .

...