Как реализуется GUI на чистом функциональном языке без состояния (например, на Haskell)?
==========================================================================================

 Скажите, как на чистом функциональном языке без состояния (например, на Haskell) можно реализовать GUI? Ведь для GUI необходимо состояние (например, для поля ввода нужна переменная, в которую будет сохраняться вводимый в поле ввода текст).  

  

Я не беру в расчёт ситуации, когда для Haskell пишутся GUI библиотеки на другом, более низкоуровневом языке (с состоянием). Мне интересно, как можно реализовать работоспособный GUI элемент (то же поле ввода) на чистом Haskell? И возможно ли это? Видел в обсуждениях упоминание о GUI на Haskell, но какая техника стоит за этим так и не понял. 

 C чего вы взяли, что в Хаскеле «нет состояния»? С состоянием позволяют работать монады ST, State (трансформер StateT), и, конечно, IO. Это может работать местами менее производительно, без каких-то доп. гарантий, но это полноценная рабочая часть языка — факт. И да, ST и IO вполне можно реализовать на самом Хаскеле.  

  

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

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

 Смотрите "Functional Reactive Programming". Упрощенно говоря программа получает поток событий и возвращает поток ответных действий. 

 Для любого языка имеются библиотеки, написанные на более низком уровне. Для одних языков их больше, для других — меньше.  

Как делаются библиотеки под Haskell я не знаю, но Вас интересует именно аспект, связанный с сохранением чистоты при работе с GUI. На уровне использования языка, сохранить чистоту можно, оборачивая все «нечистые» вычисления в монады, например, в IO. Удобно использовать представление, которое в математике называется категорией Клейсли, когда «нечистая» функция A -> B превращается в чистую A -> IO B. Примеры привёл egorinsk комментарием выше. 

 Лучше поздно, чем никогда.  
  
[Например](http://eax.me/wxhaskell/). Дело в том, что состояние на самом деле есть, даже в Haskell. 

 Думаю, неплохой ответ на этот вопрос можно найти [тут](http://book.realworldhaskell.org/read/gui-programming-with-gtk-hs.html)