何时使用函数式编程语言?
在哪种情况下,我应该select使用函数式编程语言,而不是像C ++,C#或Java这样的更加冗长的面向对象的语言?
我明白什么是函数式编程,我不明白什么types的问题是一个完美的解决scheme?
在我看来,函数式语言主要有两点:游戏AI和math计算。 这在游戏AI中是很好的,因为它有很好的列表操作(至less在Lisp和Scheme中),并且由于语法的原因,用于math计算。 Scheme,Lisp和Haskell具有使math计算易于阅读的语法。 我必须补充的最后一件事是function语言是非常有趣的语言。 我的计划课程是我最开心的课程之一。
我自己做了一些研究,并认为我可以将CONCURRENCY添加到使用function语言的原因列表中。 看到在不久的将来,处理器速度将无法使用相同的CPU技术增加。 架构的物理学不会允许它。
这就是并发处理进来的地方。
不幸的是,由于数据之间的相互依赖性,大多数OOP语言不能同时利用多个处理器。
在纯函数式编程语言中,计算机可以同时运行两个(或更多)function,因为这些function不会改变外部状态信息。
这里是一个关于函数编程的优秀文章 ,您可以享受。
我的一位朋友引用他的一位大学教授的话说:
用顶部的数据types绘制一个网格,并在左边的数据types上进行操作。 如果你垂直切割网格,你正在做OO; 如果你水平切片,你在做FP。
我的答案是FP是一种完全可行的编程方法,其应用范围与OO一样广泛。 与任何编程语言select的讨论一样,我认为更重要的问题是:
- 你有时间去学习新的记法和新的思维方式吗?
- 你正在考虑哪种语言有足够丰富的库,你不会被重新发明轮子?
至于第一个问题,如果你这样做主要是为了学习的价值,我会build议看看Haskell ,因为支持材料(书籍,文章,活跃的社区等)的范围广泛,
至于第二个问题,Haskell有一个很好的库(虽然有些比其他的更成熟),但是Scala (一个运行在JVM上的混合OO函数式语言)有更多的优点,可以逐渐过渡到函数式,而且您可以使用各种Java可访问的库。
实际上,您可以在PP中做的所有事情都可以在FP中完成,相同的事情也可以在FP中完成。 这只是编码的另一种方式 – 对问题的另一种观点和解决问题的另一种方式。
然而,由于没有多less人使用FP,所以问题更多的是缺乏良好的图书馆,可移植性/可维护性(因为维护者比使用C ++更容易理解用C ++编写的东西),缺乏文档和社区。 我知道有一些文档,但是,比较,以C ++,C#或Java,你会明白我的意思。
但是,如果你真的想做FP,你甚至可以在C ++和C#中使用这种风格。 当然,如果你使用标准库,它不会是100%FP。 不幸的是,我不认为C#被优化用于函数式编程,它可能会产生很多性能问题。
这是更主观的职位,我对FP的看法。 这不是一个严格的声明。
虽然这是相当主观的问题,但我想补充一点,函数式语言被用来parsing特定于领域的语言 ; function性很好地parsing语法。
函数式语言在很多情况下都是很好的。 这取决于特定function语言的库。
你将如何回答“什么时候使用面向对象的编程语言?”这个问题?
一般来说,使用最容易expression问题解决scheme的语言。 对于函数式编程来说,这是一个问题的解决scheme,很容易用函数来表示,因此也就是名称。 一般来说,对于math运算,AI,模式匹配是很好的; 一般来说,任何可以被分解成一系列必须被应用来得到答案的规则。 只有在充分分析问题之后,才能真正确定要使用的“最佳”语言。 这是伪代码派上用场的地方。 如果您发现自己正在编写看起来像FP的伪代码,请使用FP。
当然,所有完整的编程语言在function上都是等价的,所以根据你可以解决的问题,你select哪一个并不重要。 主要影响是编码效率和准确性,易于维护。
还要注意,可以通过巧妙devise的API在OO语言中模拟FP。 例如,我已经看到许多使用方法链来模拟FP DSL的Java库(JMock是一个例子)。 然后你会看到如下的结构:
logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );
这实质上构build了一个函数,用于确定模拟对象上的某个调用序列是否正确。 (从http://www.jmock.org/yoga.html盗取的例子);
另一种OO语言中另一种类似FP的语法是使用闭包,比如在Ruby中。
从我所看到的情况来看,这更多的是品味而不是function(不是双关语)。 对于任何一种风格的语言来说,都没有任何事情使得它在特定的任务中更好或更糟。