Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/37: Рейтинг темы: голосов - 37, средняя оценка - 4.89
Модератор
 Аватар для Curry
5154 / 3474 / 536
Регистрация: 01.06.2013
Сообщений: 7,532
Записей в блоге: 9

Делаю GUI на Haskell

01.04.2017, 00:07. Показов 7814. Ответов 77
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам

Предпосылки
Нормального, кроссплатформенного, графического интерфейса в настоящий момент для Haskell нет. Имеющиеся обёртки к сишным либам (GTK+, WxWidgets) оставляют желать лучшего, мягко говоря. С каждой новой версией и сишной библиотеки, и обёртки вылезают баги их совместимости. Особенно это заметно под Windows, т.к. под этой ОС авторы обёрток не привыкли их проверять. Проблемы кросс-языковой совместимости, в принципе, это проблемы человеческого фактора. Но они реально достают.
Выбор
И так, я стал выбирать как можно более низкоуровневую кроссплатформенную библиотеку с тем, что бы она наименее мешалась, а практический весь GUI реализовать на Haskell. Такой подход, как я предполагаю, максимально снизит «обёрточные» проблемы, или, если угодно, они будут сосредоточены в одном Haskell пакете (или нескольких взаимосвязанных) где фиксить их будет куда проще. Кроме того, разработка новых компонент GUI-я, так же будет происходить в рамках одного языка, что, очевидно, удобнее.
Из рассматриваемых кандидатов я отклонил OpenGL как очень избыточную для целей обычного (2D) интерфейса. К тому же она медленна под Windows.
От использования браузера через JavaScript я отказался на основании некоторых, накладываемых на такой интерфейс ограничений.
Выбор я остановил на библиотеке SDL2. И, хотя это мультимедийная библиотека, якобы заточенная под геймдев, мне в ней понравился простой API для работы с окнами, мышью и клавиатурой. Под винду она использует DirectX (хотя может и OpenGL), под другие ОС только OpenGL. Допускается создание любого числа окон операционной системы, получение сообщений от устройств ввода через очередь сообщений. Возможность создавать свои сообщения (нужны для обновления интерфейса из потоков), возможность работать с весьма ограниченным набором примитивов и текстурами. Рендеринг текста и загрузка изображений из многих графических форматов реализована сопутствующими сишными библиотеками SDL_ttf и SDL2_image. В принципе, возможно подключить более «навороченную» библиотеку cairo в качестве дополнения, Haskell обёртки к которой есть, при чём даже специально к SDL, но я пока cairo в сам проектируемый GUI не заложил. Для GUI хватает и графических примитивов SDL2.


Упрощённо иерархия выглядит так.


Нудное описание
Базовый слой GUI поддерживает дерево Widget-ов общего назначения. Алгоритмы последовательности их отрисовки, доставку событий (в виде вызовов функций Widget-а) от мыши и клавиатуры, учёт наложений, скроллирования, взаимодействия между окнами приложения и прочие «общие» моменты. Базовый Widget представляет собой фиксированную запись с полями – свойствами Widget-а и набором полей – функций, создаваемых, предположительно, только при (даже перед) созданием самого виджета. Набор функций напоминает набор обработчиков событий в распространённых, ООП-ешных GUI. Конкретные виджеты (виджеты компоновок – layout-ы, надписи, кнопки и пр. представляют собой (на уровне данных) объединение в одном типе типа базового виджета и типа уникального для конкретного виджета. Т.е. данные описывающие более высокоуровневые виджеты имеют в качестве одного из полей запись виджета более низкоуровневого. Базовый виджет всегда хранится по ссылке (IORef). Так же, через
IORef он доступен в дереве виджетов базового слоя.
В известном чате мне советовали использовать FRP, но если посмотреть исходники FRP пакетов, то внутри там IORef-ы и есть. Пока воздержусь от использования в GUI. Может потом поумнею? (хм... куда уж там).
Про исходники (нет, я не копира...)
Исходники, к сожалению, я пока не готов выложить по следующим причинам:

- Ещё мало чего можно показать. Не хотелось бы что бы скачали, посмотрели и сказали «фи, опять какая то недоделка». Да, пока весьма недоделка, даже на базовом уровне по которой надо ходить опасно.

Вторая причина – нет комментариев. Да, надо бы их сразу писать, я знаю. Но я себе установил для начального этапа некоторые сроки, а дело двигается медленно, и времени нет, и редизайнил уже много раз.
Так что, как только хоть что то будет – так сразу.
Ну и зачем?
Зачем я это делаю? Ну, во первых «Мужик что бык: втемяшится В башку какая блажь — Колом ее оттудова
Не выбьешь» (с) Н. А. Некрасов. Потом, это, потенциально бесконечная работа. Если (а что крайне врят ли) кто не подключится, она меня переживёт. Чем то этот момент меня привлекает. (Видимо, тоже весеннее обострение. Кодить начал, аккурат 1 марта, хотя задумывался об этом давно).

Что бы было хоть ну на что то посмотреть приведу код (без import-ов) которым создаётся верхняя картинка.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
mkExampleWidgetHelloWorld :: WidgetInit SimpleWidget
mkExampleWidgetHelloWorld = mkSimpleWidget (WidgetMarginXY 20 10) $ defNoChildrenFns{
        onCreate = (\widget -> notifyParentOnSizeChangedAndMarkForRedraw widget $ V2 0 80)
        ,onDraw=drawFn}
    where drawFn widget canvas = do
                canvasRect <- getCanvasRect widget
                setColor canvas $ V4 0 0 255 0
                fillRect canvas canvasRect
                setColor canvas $ V4 255 0 0 0
                drawRect canvas $ shrinkRect' 5 canvasRect
                fnt <- getFont canvas ""
                drawStrAligned canvas fnt AlignCenter DrawStrFine (V4 255 255 255 0) canvasRect 
                                             "Привет, мир!"
 
mkExampleWidgetPicture :: WidgetInit SimpleWidget
mkExampleWidgetPicture = mkSimpleWidget (WidgetMarginXY 20 10) $ defNoChildrenFns{
        onCreate = (\widget -> notifyParentOnSizeChangedAndMarkForRedraw widget $ V2 0 160)
        ,onDraw=(\widget canvas -> do
                    canvasRect <- getCanvasRect widget
                    drawStretchedTextureR canvas "snapshot_00.41.57.jpg" Nothing canvasRect
                )}
 
mkExampleTextGrid :: WidgetInit SimpleWidget
mkExampleTextGrid = mkSimpleWidget (WidgetMarginXY 20 10) $ defNoChildrenFns{
        onCreate = (\widget -> notifyParentOnSizeChangedAndMarkForRedraw widget $ V2 0 (-1))
        ,onDraw=drawFn}
  where drawFn widget canvas = do
            canvasRect@(   SDL.Rectangle (P (V2 l t)) (V2 w h)) <- getCanvasRect widget
            setColor canvas $ grayColor 200
            fillRect canvas canvasRect
            fnt <- getFont canvas ""
            let dx = 30
                dy = 20
                txtColor = (V4 0 100 0 0)
                txtFill r y =
                    let txtRow c x = when (x < w) $ do
                                drawStr canvas fnt txtColor (P (V2 x y)) [c,r]
                                txtRow (succ c) (x+dx)
                    in when (y < h) $ do
                        txtRow '0' l
                        txtFill (succ r) (y+dy)
            txtFill '0' t
 
main :: IO ()
main = runGUI defSkin [GuiFontDef "" "PTM55F.ttf" 14] $ \gui _ -> do
    win <- newWindow gui "GUI : vertical layout test" $ 
                       SDL.defaultWindow { SDL.windowInitialSize = V2 300 400 }
    vLayout <- (win $+) =<< mkVLayout WidgetMarginNone zero (grayColor 230)
    mapM_ (vLayout $+) [mkExampleWidgetHelloWorld, mkExampleWidgetPicture, mkExampleTextGrid]

И наконец.
Радужные перспективы.
Сделать более менее нормальный GUI со своей изюминкой, полностью типобезопасный, а потом, на нём сотворить, наконец, нормальное IDE для Haskell.
7
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2017, 00:07
Ответы с готовыми решениями:

Списки в Haskell? Что я делаю не так?
Здравствуйте, я пишу маленькую программу в Haskell, которая получает String и заменяет все цифры в нем на единички, а остальные знаки на...

Место ФП и Haskell в компьютерной индустрии (Для чего он нужен, этот Haskell?)
&quot;У нас&quot; ? А где преподавание этой экзотики на высоте? Добавлено через 2 минуты А где такие &quot;пришедшие&quot; используют...

Как запустить qt gui программу, как демон, без gui, скрыв gui?
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер выполняет определенные действия, и нужно запустить этот...

77
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
01.04.2017, 06:06
KolodeznyDiver, выражаю горячее одобрение и поддержку!
1
01.04.2017, 09:07

Не по теме:

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Мужик что бык:
настоящие мужчины не используют косметику выбирают "безопасные" языки

0
97 / 78 / 12
Регистрация: 07.06.2015
Сообщений: 132
Записей в блоге: 12
01.04.2017, 13:42
Я довольно много на хаскелле писал гуи приложений, и, в результате всех трудов, пришел к выводу - гуи не нужно. Возможно, я ошибаюсь. Возможно, я не в тех кругах общаюсь и работаю. Но по тенденции развития, приходишь к выводу за вебом будущее. И, что самое приятное, на хаскеле можно писать гуевые приложения в браузере. Данное чудо зовется https://wiki.haskell.org/Threepenny-gui. Не поймите не правильно - это не реклама и не критика, просто если вдруг окажется что я прав, то гуи станет не нужен, посему проект с гуи будет не очень пользоваться спросом. А если это все будет в вебе(опять же, в случае моей правоты), то пример, который вы задумали будет очень пользоваться спросом и в будущем. Пока проект на начальном этапе, пишу об этом, пока не стало поздно переводить его, если совет покажется интересным.
0
Заблокирован
01.04.2017, 13:57
loothood, Вы абсолютно правы, ни гуй ни хаскель не нужны. Все плавно переходит в веб, на облака и тп., а факториалы успешно реализованы на фортране и более индустрия в них не нуждается
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
01.04.2017, 14:13
agregationcompo, в подобных прогнозах часто ошибаются даже великие. Примеров масса. К счастью, мир оказывается сложнее. Если бы человечество следовало вашей логике, мы бы жили в пещерах.
1
Модератор
 Аватар для Curry
5154 / 3474 / 536
Регистрация: 01.06.2013
Сообщений: 7,532
Записей в блоге: 9
01.04.2017, 14:13  [ТС]

Не по теме:

Цитата Сообщение от loothood Посмотреть сообщение
Я довольно много на хаскелле писал гуи приложений, и, в результате всех трудов, пришел к выводу - гуи не нужно.
Это типа "мне автомобиль не нужен, потому что у меня его нет".

Цитата Сообщение от loothood Посмотреть сообщение
на хаскеле можно писать гуевые приложения в браузере
Да, можно, разными способами. Трёхгрошовый gui один из самых простых. Однако, в большинстве языков существуют И web-gui, и desktop-ные. Тема перехода всех gui в браузер как то обсуждалась в холиварах.

Не по теме:

Цитата Сообщение от loothood Посмотреть сообщение
то гуи станет не нужен, посему проект с гуи будет не очень пользоваться спросом.
Ну, вот, а я то уже помещение в аренду под магазинчик присматриваю - гуем торговать. :)

2
01.04.2017, 14:25

Не по теме:

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Ну, вот, а я то уже помещение в аренду под магазинчик присматриваю - гуем торговать.
я, наверное, не совсем правильно выразился. Я подумал что вы делаете для себя с упором на то, что ваше начинание будет подспорьем для новых программистов, которых захотят сделать нечто подобное, но, как уже писал выше, если гуи умирает, то сделать ваш пример для веба будет гораздо более полезнее для следующих поколений программистов, чем на гуи.

0
Заблокирован
01.04.2017, 14:26
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Однако, в большинстве языков существуют И web-gui, и desktop-ные. Тема перехода всех gui в браузер как то обсуждалась в холиварах.
Это пережиток прошлого. Никто не мешает писать десктоп на веб-гуе, инструметы для этого уже имеются, и это уже делается, а зоопарк гуев не нужен.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
01.04.2017, 14:35
Цитата Сообщение от agregationcompo Посмотреть сообщение
а зоопарк гуев не нужен
- как хорошо, что вам не дано возможности принимать реальные решения...
3
Эксперт .NET
 Аватар для Usaga
14126 / 9345 / 1350
Регистрация: 21.01.2016
Сообщений: 35,110
01.04.2017, 15:22
Цитата Сообщение от agregationcompo Посмотреть сообщение
а зоопарк гуев не нужен
Ну так и не пользуйтесь. Но умоляю вас, не говорите за всех.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
05.04.2017, 22:52
KolodeznyDiver,
Декларативный подход к созданию гуи не рассматривали?
0
Модератор
 Аватар для Curry
5154 / 3474 / 536
Регистрация: 01.06.2013
Сообщений: 7,532
Записей в блоге: 9
05.04.2017, 23:46  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Декларативный подход к созданию гуи не рассматривали?
Не вырисовывается. Если есть идеи - давайте. FRP, по крайней мере пока не задействовал. Я не ставлю задачу сделать GUI "очень по функциональному", потому что "очень по функциональному" ещё никто и не сделал. У меня первоочередная задача сделать работающий GUI. И типобезопасный. А в его обработчиках уже, пожалуйста, декларативно-функциональный подход любой.

Добавлено через 45 минут
Shamil1, если же вы имеете ввиду использование декларативных языков типа xaml,qml то была мысль в очень дальнейшем их использовать в графическом конструкторе интерфейса, и потом по ним генерить код на Haskell (в рантайме такие форматы читать меня не привлекает совсем). В самих этих форматах лицензии не свободные... ну и я так глубоко в лицензии не закапывался.
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
06.04.2017, 09:53
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
если же вы имеете ввиду использование декларативных языков типа xaml,qml то была мысль в очень дальнейшем их использовать в графическом конструкторе интерфейса, и потом по ним генерить код на Haskell
Я имел ввиду:
использование декларативных языков типа xaml,qml
без графического конструктора интерфейса
и потом по ним генерить код на Haskell
0
Модератор
 Аватар для Curry
5154 / 3474 / 536
Регистрация: 01.06.2013
Сообщений: 7,532
Записей в блоге: 9
06.04.2017, 11:18  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Я имел ввиду:
использование декларативных языков типа xaml,qml
без графического конструктора интерфейса
А от них есть польза без графического конструктора интерфейса?
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
06.04.2017, 13:15
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
А от них есть польза без графического конструктора интерфейса?
Огромная.

Возьмём, к примеру, HTML. Мало кто из программистов использует графический интерфейс для создания/редактирования HTML-разметки. При этом создание/изменение HTML в текстовом файле гораздо удобнее/производительнее, чем создание/изменение структуры DOM в коде.
0
Модератор
 Аватар для Curry
5154 / 3474 / 536
Регистрация: 01.06.2013
Сообщений: 7,532
Записей в блоге: 9
06.04.2017, 13:56  [ТС]
Shamil1, я вас понял, но я пока , как свободное время появляется, ядро GUI делаю. Вопрос об использовании разметочных языков пока несколько преждевременный. Про HTML весьма оффтопично. Я воздержусь. По крайней мере в этой теме.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
07.04.2017, 08:45
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Не вырисовывается.
вот тут товарищи делали http://clean.cs.ru.nl/Object_I/O#Features
в принципе от хаскеля почти не отличается
2
Модератор
 Аватар для Curry
5154 / 3474 / 536
Регистрация: 01.06.2013
Сообщений: 7,532
Записей в блоге: 9
07.04.2017, 10:05  [ТС]
pycture, "Не вырисовывается" я написал в контексте декларативного описания GUI. Так то вырисовывается. Ещё бы время было. За ссылку спасибо. При беглом просмотре не вижу там большей декларативности чем у меня. Зато настораживает "Programming of GUI elements in an object oriented style". По хорошему, надо бы и эту либу изучить, но я даже сам clean не знаю. Может как ни будь.
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
07.04.2017, 10:20
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
но я даже сам clean не знаю
это практически тоже, что и хаскель, включая ленивость, просто вместо монад уникальные типы. к либе кстати солидный док прилагается http://clean.cs.ru.nl/download... torial.pdf

Добавлено через 3 минуты
хе
https://www.microsoft.com/en-u... jectio.pdf
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2017, 10:20
Помогаю со студенческими работами здесь

[ubuntu] Как запустить qt-gui программу без gui-интерфейся из консоли?
Как запустить qt-gui программу без gui-интерфейса из консоли?

Как запустить GUI приложение (например, notepad.exe) без отображения GUI?
Добрый день. Интересует есть ли такая возможность, как запустить GUI приложение (например, notepad.exe) без отображения GUI?

LWJGL+ GUI - Выход из рендерного цикла для работы в GUI без потери окна
Всем привет! Учусь использовать OpenGL в Java. И у меня возникла небольшая проблемка, окно LWJGL запускается с гуи, и если уже...

LWJGL и GUI - Выход из рендерного цикла для роботы в GUI без потери окна
Всем привет! Учусь использовать OpenGL в Java. И у меня возникла небольшая проблемка, окно LWJGL запускается с гуи, и если уже запустился...

Как лучше и быстрее из SQL в QVector и в GUI или сразу из SQL в GUI
Доброе время суток! Ну собственно вопрос в теме, как лучше сделать. Сначала прочитать SQLite в вектор и работать с ним и оставить файл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru