功能性GUI编程是否可行?
我最近发现了FP错误(试图学习Haskell),并且我对迄今为止所看到的内容(一流的函数,懒惰的评估以及所有其他的好东西)印象深刻。 我还没有专家,但我已经开始发现,在功能上推理比在基本算法中推理更容易(并且我在遇到麻烦时必须返回)。
然而,目前的FP似乎平坦的一个领域是GUI编程。 Haskell方法似乎只是包装命令式GUI工具包(如GTK +或wxWidgets)并使用“do”块来模拟命令式样。 我没有使用过F#,但是我的理解是它使用OOP和.NET类做类似的事情。 显然,这有一个很好的理由 - 目前的GUI编程都是关于IO和副作用的,所以纯粹的函数式编程在大多数当前的框架中是不可能的。
我的问题是,是否有可能对GUI编程有功能性的方法? 我很难想象这在实践中会是什么样子。 有没有人知道任何框架,实验或其他,尝试这种事情(甚至任何框架是从头开始设计的功能语言)? 或者是仅使用混合方法的解决方案,OOP用于GUI部件和FP用于逻辑? (我只是出于好奇而问 - 我很喜欢认为FP是“未来”,但GUI编程似乎是一个相当大的空缺)。
Haskell方法似乎只是包装命令式GUI工具包(如GTK +或wxWidgets),并使用“do”块来模拟命令式样
这不是真正的“Haskell方法” - 这就是你如何直接绑定到命令式GUI工具包 - 通过命令式界面。 Haskell碰巧有相当突出的绑定。
有几种中等成熟或更实验性的纯功能/声明式GUI方法,主要在Haskell中,主要使用功能性反应式编程。
一个例子是
对于那些对Haskell不熟悉的人,Flapjax,http://www.flapjax-lang.org/是一个在JavaScript之上的功能反应式编程的实现。
我的问题是,是否有可能对GUI编程有功能性的方法?
您正在寻找的关键词是“功能性反应式编程”(FRP)。
Conal Elliott和其他一些人为了寻找FRP的正确抽象而做出了一些平房行业。 Haskell中有几个FRP概念的实现。
您可以考虑从Conal最近推出的“Push-Pull Functional Reactive Programming”文章开始,但还有其他一些(较老的)实现,其中一些从haskell.org网站链接。 康纳尔具有覆盖整个领域的诀窍,他的论文可以在不参考之前的内容的情况下阅读。
为了了解这种方法如何用于GUI开发,您可能需要看看Fudgets,尽管这些日子在90年代中期被设计出来,但它确实呈现出坚实的FRP方法到GUI设计。
Windows Presentation Foundation是功能性方法在GUI编程中非常有效的证明。 它具有许多功能方面和“好”的WPF代码(搜索MVVM模式)强调功能性方法胜过命令式。 我可以勇敢地宣称WPF是最成功的真实世界功能GUI工具包:-)
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与Haskell的FRP有许多共同之处(尽管我相信WPF设计人员并不了解FRP,这有点不幸 - WPF有时会觉得有点奇怪和不清楚,如果你使用的是功能观点看法)。
链接地址: http://www.djcxy.com/p/7425.html