[Haskell] Работа в новом окне

 
0
 
Functional languages
ava
youTouchMyTaLaLa | 31.05.2010, 22:18
Я пишу консольное приложение на хаскелл, запускаемое через runhugs. В окне производится основная работа программы. Но мне нужно как-то создать ещё одно окно для работы в нём. Возможно это каким-либо образом сделать ?
Comments (7)
ava
Void | 01.06.2010, 14:13 #
Первое что хотелось бы уточнить: используете вы Windows или *nix.
Второе: что именно нужно делать в дополнительном окне. В зависимости от того, требуется только вывод или интерактивная работа, можно предложить решение попроще.

В любом случае, придётся запустить отдельный процесс, внутри $TERM или cmd.exe, и общаться с ним посредством системных средств IPC. System.Posix, что есть в Hugs, должно хватить для *nix, что делать в Windows, я сходу не скажу.
ava
youTouchMyTaLaLa | 01.06.2010, 18:11 #
Windows у меня.
Ну вот я додумался до следующего решения - использовать модуль System.Cmd и следующую команду

system "runhugs.exe MyModule.hs"

Правда загвоздка в том, что мне необходимо передать массив в этот модуль.. Пытался сделать так:

action :: Database -> IO()
action db = do
                         system "runhugs.exe MyModule.hs db"

Но так не выходит - этот аргумент передаётся конкретно как строка "db", а не как массив.
ava
Void | 01.06.2010, 19:06 #
Не надо игнорировать второй вопрос:
Цитата (Void @  1.6.2010,  16:13 findReferencedText)
что именно нужно делать в дополнительном окне. В зависимости от того, требуется только вывод или интерактивная работа, можно предложить решение попроще.


Вы не можете так просто передать значение произвольного типа из одной программы на Haskell в другую. Расскажите подробнее о проблеме и может быть мы придумаем другое решение.
ava
youTouchMyTaLaLa | 01.06.2010, 19:27 #
В дополнительном окне требуется работа с переданной базой данных. А конкретно - поиск информации в этой базе данных и вывод её на экран. База данных рид онли. База данных описана следующим образом

type Author = String
type Title = String
type Publishing = String
type Tags = [String]
type Book = (Title,Author,Publishing,Tags)
type Database = [Book]

ava
Void | 01.06.2010, 19:46 #
Если в запущенное приложение надо передать эту базу один раз и ничего более, и никакой информации обратно получать не надо, то это довольно просто. У типа Database есть instance Show и instance Read, поэтому можно легко превратить его в строку (ф-я show) и обратно (ф-я read). Передать получившуюся строку дочернему процессу можно как аргумент командной строки или сбросить в файл. Но не так, конечно:
Цитата (youTouchMyTaLaLa @  1.6.2010,  20:11 findReferencedText)
system "runhugs.exe MyModule.hs db"

Так даже в пэхапэ каком-нибудь работать не будет, откуда интерпретатору знать, что db в строке означает переменную? Конкатенация строк — (++) и ещё есть Text.Printf.
ava
youTouchMyTaLaLa | 01.06.2010, 20:12 #
Ах! Конкатенация, точно, спасибо )
ava
bems | 01.06.2010, 22:44 #
Цитата (Void @  1.6.2010,  19:46 findReferencedText)
можно легко превратить его в строку (ф-я show) и обратно (ф-я read).
Но нужно помнить, что в Windows длина командной строки ограничена
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit