函数式编程语言是否适合实际任务?

时间:2009-10-12 10:37:59

标签: functional-programming scientific-computing

在我对Haskell,Erlang和Scheme的实验中,我认为函数式编程语言是回答科学问题的绝佳方式。例如,获取一小组数据并对其进行一些广泛的分析以返回重要答案。它非常适合处理一些棘手的Project Euler问题或以原始方式尝试使用Google Code Jam。

与此同时,它们本质上似乎更适合寻找分析解决方案,而不是实际执行实际任务。我在Haskell中最强烈地注意到这一点,其中所有内容都被懒惰地评估,并且您的整个程序归结为一个巨大的分析解决方案,用于某些给定的数据,您要么硬编码到程序中,要么通过Haskell的有限IO功能搞乱。

基本上,我称之为'实用'的任务,如

Aceept a request, find and process requested data,
 and return it formatted as needed

似乎更直接地转换为过程语言。最幸运的是我找到了一个像这样工作的函数式语言,我将其比作Python的反向抛光符号版本。

所以我很好奇我是否错过了这些语言中的某些内容,或者我对这个问题的提出方式还有点不对劲。有没有人有功能语言的例子,这些语言非常适合执行最能通过函数式语言执行的实际任务或实际任务?

9 个答案:

答案 0 :(得分:8)

关于语言,我认为F#是一个主要是“功能性”但也“实用”的语言的例子。 Scala和Clojure可能是此类别中的其他人。

(更深层次,我认为'成功的公式'是一种强烈倾向于'功能'的语言,但可以访问大量的实用库(例如.Net / JVM /某些C FFI)并且具有良好的实用性工具(例如IDE支持)。)

我至少在某种程度上同意这个问题的隐含前提,即“简洁/美丽的分析能力”和“语用学”之间存在着紧张关系。

答案 1 :(得分:5)

  

有没有人有功能语言的例子,这些语言非常适合执行最佳功能语言的实际任务或实际任务?

我们的业务以F#代码运行,适用于从在线信用卡交易到网站分析的所有内容。这些LOB应用程序由微小的F#脚本组成,可以快速,简单地使用.NET的无缝互操作和Outlook和Excel等应用程序的自动化。

我们的业务大部分资金销售用F#编写的软件,解决了从医疗设备嵌入式软件到海事互联网服务提供商等许多领域的客户的实际问题。

答案 2 :(得分:4)

IMO,Scheme太简约而不实用 - 它被用于多个教学课程(参见计算机程序的结构和解释)。然而,像Common Lisp这样的现代Lisp语言,尤其是Clojure,正变得越来越重要。 Erlang被几个大型行业用于高并发应用程序,我个人还没有看到它被最终用户程序员使用。另一方面,Haskell是一种真实世界的语言,并且已被用来编写许多精彩的软件,包括:

  1. XMonad是一个纯粹在Haskell中编写的X Window System窗口管理器。
  2. Leksah,Haskell的IDE是用Haskell本身编写的。
  3. Pugs,Perl 6的主要实现之一是用Haskell编写的。
  4. 最后,格拉斯哥Haskell编译器是用Haskell编写的。

答案 3 :(得分:4)

有趣的是,你和我对“实际任务”有着截然不同的看法。你说的是:

  

发出请求,查找并处理   请求数据,并将其返回   根据需要格式化

这几乎是一种功能语言:用于获取数据并返回新数据而不保留任何状态中间调用(即没有副作用)的函数。这就是你在这里所拥有的,它也被称为管道。

现在这不是我所谓的实际任务。在现代程序中,您必须处理GUI,多线程函数和网络I / O.所有这些都具有在函数调用之间保存数据所需的状态。数据不会通过管道传输到函数中,结果也会输出,这些函数也会影响“全局”状态。

这就是功能程序开始失败的“实际任务”的定义。如果不使用命令式扩展,那么在功能程序中编写GUI几乎是不可能的。

总而言之,您所要求的答案是一种内心的感觉,功能性程序可以胜任这项任务。然而,你真正想要的答案是,它比那更复杂。

答案 4 :(得分:3)

你曾经使用过LINQ吗?

如果是的话,恭喜你。您已在实际环境中使用了函数式语言。这就是功能开发的意义所在。

是的,F#非常有用。

答案 5 :(得分:2)

Erlang以其强大的功能和编写高度并发服务器的功能而闻名。

它还有一个DBMS开箱即用。

答案 6 :(得分:2)

答案 7 :(得分:2)

  

基本上,我会打电话给我   <实用',如

     
    

发出请求,查找并处理     请求数据,并将其返回     根据需要格式化

  

您是否尝试过Erlang,但在实际描述中无法找到实际的任务?

  

接受请求。

你的意思是receive。或者只是直接被称为函数。

  

查找并处理所请求的数据。

我不完全确定你在这里是什么意思,但是为了查找数据,有文件I / O,网络I / O,(分布式)进程间通信等等。为了找到那些数据的子集,那里有正则表达式,模式匹配等

对于处理,有大量的东西用于字符串,列表,数学,集合,图形等。这还不足以进行处理吗?你还在寻找什么?

  

根据需要将其格式化。

我可以将结果数据作为原子,列表,二进制blob,格式化字符串,数字等返回。在这方面Erlang缺少什么?我真的很困惑。

答案 8 :(得分:0)

我不确定'实际任务'的定义及其含义。 但换句话说,我认为你所说的是通过需要用编程语言表示的算法来解决问题。如果是这样,那么函数式语言非常有用和实用。特别是当你有时间限制来找到解决方案并实现它时。 对我来说,在参与解决像Google CodeJam这样复杂的算法竞赛时,我仍然使用非函数式语言。 我打算学习一种功能性语言,对我来说这些任务或问题会更好。