对于哪些常见问题,函数式编程不适合?[关闭]


22

函数式编程是一种声明式范例。FP的优势之一是避免了副作用。据说对于某些问题,FP不太适合。

对于哪些常见问题,函数式编程不适合吗?


ew!有一会儿我以为你说“是一个有缺陷的范例”。然后我回来检查。
Mark C

1
我认为说副作用是孤立的(无论如何在Haskell中)比避免副作用更为准确。Monad确实允许状态更改,甚至还可以命名为“ State”。
拉里·科尔曼

正如拉里·科尔曼(Larry Coleman)解释的那样,函数式编程避免了副作用并不是正确的,但是它不鼓励使用它们,并且在某些语言中,它显然将它们隔离开。阅读例如research.microsoft.com/en-us/um/people/simonpj/papers/…的
Giorgio

Answers:


17

本质上非常有状态的应用程序。电子游戏是一个很好的例子,因为它们可以模拟现实世界。考虑修改世界的状态而不是每次发生变化时都从先前的状态进行重建,这更有意义。

一个具体的例子是在怪物被射击后改变其健康状况。仅仅改变它的生命比用一个全新的怪物替代它更明智,该怪物在各个方面都是相同的,只是现在它的健康程度降低了。这些变化几乎构成了游戏世界中的所有内容,以纯功能的方式进行操作并不是很直观。我想至少在使用纯功能性语言的情况下,可能会有一些重大的性能损失。

(附带说明,游戏中的某些问题非常适合功能编程,例如AI。混合功能/命令式语言将非常适合这些情况。)


9
下一代主流编程语言:游戏开发者的观点》一文提出了一种策略,特别是针对游戏开发,其中纯功能行为是默认行为,状态更改通过类型进行跟踪,以避免错误。因此,并非所有人都认为功能范式天生就不适用于游戏编程。
sepp2k 2010年

1
@ sepp2k,感谢您的链接。我很高兴看到制作真实游戏的人提出了这种观点。
Matt Olenik

3
@ sepp2k等待,我错过了什么吗?在仔细阅读了演示文稿之后,Sweeney似乎在争论大多数核心引擎是用纯功能代码编写的,而大多数游戏逻辑是强制性编写的(或至少允许这样做),并使用STM来帮助并发。 。这对我来说似乎很合理。
Matt Olenik

@Matt:不,你是对的,他确实说游戏逻辑部分将包含可变状态。但是,这并不排除该语言跟踪类型的可变性(这是他在“沉思”部分中提出的)。当然,“通过类型跟踪状态”不等于“功能”,因此我可能过于乐观地表达了我先前的评论。
sepp2k 2010年

@ sepp2k对,我明白你的意思。
马特·奥莱尼克

17

实时嵌入式编程就是副作用。与数字和模拟io,计时器,串行和并行端口进行交互时,所有有趣的事情都可以通过调用具有副作用的函数来完成。


3
好吧,如果您只是说硬件接口,我怀疑除了C / C ++之外的其他选择是否是一个不错的选择。但是,有时会在诸如Erlang之类的语言的顶层使用这种语言,特别是在电信系统中。Erlang是一种功能性语言,设计用于关键且容错的嵌入式实时系统。
乔纳斯(Jonas)2010年

@Jonas:Erlang可以最大程度地减少突变,但是它严重依赖IO传递消息,这当然是副作用。
乔恩·哈罗普

11

我认为GUI编程不适用于函数式编程。GUI通常是非常有状态的,并且使用状态而不是使用无副作用的方式对它们进行建模/管理要容易得多。对于GUI使用功能编程语言当然是可能的 ...但是,这可能不是一个好主意。

如另一个答案所述,通过跟踪状态,游戏通常更易于管理,并且尽管您可以使用功能性语言编写游戏,但是使用“有状态”语言(即面向对象)编写游戏通常更容易,更高效。语言)。


-1:您是在谈论纯净性,而忽略了一流函数的使用,例如,使用不纯FP语言的GUI代码中的回调比使用OOP语言要容易得多。
乔恩·哈罗普

4
@Jon Harrop:一流的函数并不是函数式编程语言所独有的。我仍然认为FP风格不适合GUI。
mipadi 2010年

1
取决于您问谁。对于大多数函数式程序员而言,一流的函数是函数式编程的真正定义。
乔恩·哈罗普

@乔恩·哈罗普:大多数函数式程序员都会说函数式编程是一种将程序描述为数学函数的组成和评估的方法。一流的功能是该范式的重要组成部分,但是一流的功能本身并不是功能性编程语言(或功能性程序)所制造的。函数式编程范例致力于尽量减少使用状态和可变数据结构,甚至不纯的FP语言也鼓励这种风格。FP既是一种编程风格,又是诸如一流功能之类的单个功能,而且...
mipadi 2010年

...我发现这种范例特别适合GUI编程-总体而言,面向对象的语言更适合GUI。
mipadi 2010年

5

数据驱动的业务应用程序。用户界面和简单的数据操作不需要FP。


2
以及其他任何数据/视图应用程序。大多数游戏都是关于状态并对其进行更改的,因此不能很好地转换为功能样式。
乔恩·普迪

18
真?我一直认为FP会特别这一点。这些应用程序在选择,汇总和投影数据方面有99%的价值,这难道不是吗?这基本上是filterreducemap。再加上一些sortpartitiongroupBy。毕竟,用于编写此类应用程序的最广泛使用的编程语言是Excel,这一种功能语言。
约尔格W¯¯米塔格

3
数据驱动的业务应用程序以及具有简单数据操作的应用程序听起来非常适合FP,而且我听说FP在此类方面很受欢迎。例如,华尔街上的Adventures fa函数程序员
乔纳斯(Jonas)2010年

1
-1:您列出了FP擅长的一些应用程序。
乔恩·哈罗普

2

您不能轻易地消除任何不适合功能编程的问题集。

在很大程度上取决于用于函数式编程及其功能的实际语言。

一个例子是已经提到的实时嵌入式系统的Erlang。

状态充满也不是反对函数式编程的好标准,有几种成功的方法可以用函数式编程语言来实现。

还经常提到对函数式编程的副作用。每个不完全单一化的程序都有副作用。因此,每种现实世界中的FP语言都可以通过某种方式来处理此问题,这仅仅是封装世界副作用的优雅程度。

根本不需要像全局变量这样的任意副作用。

但是有些问题集可以使您更轻松地进行函数式编程,因为它们不会使您熟悉的看待问题的方式变多。但是一旦您设法认为功能越来越多的问题集就较少产生副作用。

即使在编写C语言时,始终尽可能减少全局变量之类的副作用也是一个好主意。


有状态的应用程序(例如GUI应用程序)实际上很难以功能的方式完成,或者您有任何建议吗?
乔纳斯(Jonas)2010年

如果您具有某种进程/线程抽象(例如,在Erlang中),则可以在进程中传递状态。
Peer Stritzinger

3
GUI应用程序通常围绕事件循环构建。您可以使用功能语言很好地编写事件循环。如果比较复杂,您可能会添加一些线程/进程用于后台处理。但是,如果您具有某种进程/线程抽象(例如,在Erlang中),则可以轻松地在进程中传递状态。延续也可能派上用场。我认为它只是习惯于以一种功能性的方式来做事情,甚至可以处理GUI。如今,GUI编程被认为很困难的一个原因是,大多数工具包都不适合功能用途。
Peer Stritzinger

1
@Jonas:在Haskell中,您将使用IO monad,State monad或它们的组合。
拉里·科尔曼

1
@Jonas:这取决于您对有用的定义。Wikibook示例使用wxHaskell,而Real World Haskell使用gtk2hs。我也没有尝试过,因为我的Haskell应用程序基于命令行。
拉里·科尔曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.