Возможно ли функциональное программирование GUI? [закрыто]

Квадратные скобки имеют особое значение для селекторов jQuery , специальные фильтры атрибутов.

Просто выйдите из них, и он найдет ваш элемент в порядке

$( "#something\\[" + id + "\\]" )

391
задан shosti 20 April 2010 в 05:35
поделиться

7 ответов

Подход Haskell, похоже, заключается в том, чтобы просто обернуть императивные инструменты графического интерфейса (например, GTK + или wxWidgets) и использовать блоки «do» для имитации императивный стиль

На самом деле это не «подход Haskell» - это просто способ непосредственной привязки к императивным инструментам GUI - через императивный интерфейс. У Haskell просто есть довольно заметные привязки.

Существует несколько умеренно зрелых или более экспериментальных чисто функциональных / декларативных подходов к графическому интерфейсу пользователя, в основном на Haskell и в основном использующих функциональное реактивное программирование.

Вот некоторые примеры:

Для тех из вас, кто не знаком с Haskell, Flapjax, http: //www.flapjax -lang.org/ - это реализация функционального реактивного программирования поверх JavaScript.

183
ответ дан 22 November 2019 в 23:42
поделиться

Используете ли вы гибридный функциональный / объектно-ориентированный язык, такой как F # или OCaml, или чисто функциональный язык, такой как Haskell, где побочные эффекты относятся к монаде ввода-вывода, это в основном тот случай, когда Тонна работы, необходимой для управления графическим интерфейсом пользователя, больше похожа на «побочный эффект», чем на чисто функциональный алгоритм.

Тем не менее, было проведено действительно серьезное исследование функциональных графических интерфейсов . Есть даже некоторые (в основном) функциональные наборы инструментов, такие как Fudgets или FranTk .

17
ответ дан 22 November 2019 в 23:42
поделиться

Я бы сказал, что функциональное программирование (F#) является гораздо лучшим инструментом для программирования пользовательского интерфейса, чем, например, C#. Вам просто нужно думать о проблеме немного по-другому.

Я обсуждаю эту тему в моей книге по функциональному программированию в главе 16, но есть бесплатный отрывок, который показывает (IMHO) самый интересный паттерн, который вы можете использовать в F#. Допустим, вы хотите реализовать рисование прямоугольников (пользователь нажимает кнопку, перемещает мышь и отпускает кнопку). На F# вы можете написать что-то вроде этого:

let rec drawingLoop(clr, from) = async { 
   // Wait for the first MouseMove occurrence 
   let! move = Async.AwaitObservable(form.MouseMove) 
   if (move.Button &&& MouseButtons.Left) = MouseButtons.Left then 
      // Refresh the window & continue looping 
      drawRectangle(clr, from, (move.X, move.Y)) 
      return! drawingLoop(clr, from) 
   else
      // Return the end position of rectangle 
      return (move.X, move.Y) } 

let waitingLoop() = async { 
   while true do
      // Wait until the user starts drawing next rectangle
      let! down = Async.AwaitObservable(form.MouseDown) 
      let downPos = (down.X, down.Y) 
      if (down.Button &&& MouseButtons.Left) = MouseButtons.Left then 
         // Wait for the end point of the rectangle
         let! upPos = drawingLoop(Color.IndianRed, downPos) 
         do printfn "Drawn rectangle (%A, %A)" downPos upPos }

Это очень императивный подход (в обычном прагматичном стиле F#), но он позволяет избежать использования изменяемого состояния для хранения текущего состояния рисования и для хранения начального местоположения. Однако его можно сделать еще более функциональным, я написал библиотеку, которая делает это в рамках моей магистерской диссертации, которая должна быть доступна на моем блоге в ближайшие пару дней.

Функциональное реактивное программирование - это более функциональный подход, но я нахожу его несколько более сложным в использовании, поскольку он опирается на довольно продвинутые возможности Haskell (такие как стрелки). Тем не менее, он очень элегантен в большом количестве случаев. Его ограничение заключается в том, что вы не можете легко закодировать машину состояний (которая является полезной ментальной моделью для реактивных программ). Это очень легко сделать с помощью приведенной выше техники F#.

28
ответ дан 22 November 2019 в 23:42
поделиться

Вы можете посмотреть серию статей Дона Сайма на F #, где он демонстрирует создание графического интерфейса. следующая ссылка относится к третьей части серии (вы можете перейти оттуда к двум другим частям).

Использование F # для разработки WPF было бы очень интересной парадигмой графического интерфейса ...

http://channel9.msdn.com/shows/Going+Deep/C9-Lectures-Dr-Don-Syme-Introduction-to -F-3-of-3 /

15
ответ дан 22 November 2019 в 23:42
поделиться

Windows Presentation Foundation является доказательством того, что функциональный подход очень хорошо работает для программирования с графическим интерфейсом пользователя. Он имеет много функциональных аспектов, и «хороший» код WPF (поиск шаблона MVVM) подчеркивает функциональный подход над императивным. Я могу смело утверждать, что WPF - самый успешный набор инструментов для функционального графического интерфейса в реальном мире: -)

WPF описывает пользовательский интерфейс в XAML (хотя вы также можете переписать его на функционально выглядящий C # или F #), чтобы создать некоторый пользовательский интерфейс вы должны написать:

<!-- Declarative user interface in WPF and XAML --> 
<Canvas Background="Black">
   <Ellipse x:Name="greenEllipse" Width="75" Height="75" 
      Canvas.Left="0" Canvas.Top="0" Fill="LightGreen" />
</Canvas>

Более того, WPF также позволяет декларативно описывать анимацию и реакцию на события, используя другой набор декларативных тегов (опять же, то же самое можно записать как код C # / F #):

<DoubleAnimation
   Storyboard.TargetName="greenEllipse" 
   Storyboard.TargetProperty="(Canvas.Left)"
   From="0.0" To="100.0" Duration="0:0:5" />

На самом деле, я думаю что WPF имеет много общего с FRP Haskell (хотя я считаю, что дизайнеры WPF не знали о FRP, и это немного прискорбно - WPF иногда кажется немного странным и неясным, если вы используете функциональную точку зрения).

62
ответ дан 22 November 2019 в 23:42
поделиться

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

Ключевые слова, которые вы ищете, - это «функциональное реактивное программирование» (FRP).

Конал Эллиот и некоторые другие создали небольшую кустарную промышленность, пытаясь найти правильную абстракцию для FRP. В Haskell есть несколько реализаций концепций FRP.

Вы можете начать с последней статьи Конала "Push-Pull Functional Reactive Programming" , но есть несколько других (более старых) реализаций, некоторые из которых связаны с сайта haskell.org ]. У Конала есть талант охватить всю область, и его статью можно читать без ссылки на то, что было раньше.

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

73
ответ дан 22 November 2019 в 23:42
поделиться

Языки разметки, такие как XUL, позволяют создавать графические интерфейсы в декларативной форме.

4
ответ дан 22 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: