23

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

与此同时,就其本质而言,他们似乎更适合寻找分析解决方案,而不是实际执行实际任务。我在 Haskell 中最强烈地注意到这一点,在这种情况下,一切都是惰性评估的,并且您的整个程序归结为针对某些给定数据的一个巨大的分析解决方案,您可以将这些数据硬编码到程序中,或者通过 Haskell 有限的 IO 功能进行混乱的处理。

基本上,我称之为“实用”的任务,例如

接受请求,查找和处理请求的数据,
 并根据需要格式化返回

似乎更直接地翻译成程序语言。我找到一种像这样工作的函数式语言最幸运的是 Factor,我将其比作 Python 的反向抛光符号版本。

所以我只是好奇我是否遗漏了这些语言中的某些内容,或者我只是在问这个问题时离题了。有没有人有函数式语言的例子,它们擅长执行实际任务或函数式语言最好执行的实际任务?

4

9 回答 9

8

关于语言,我认为 F# 是主要“功能性”但也“实用性”的语言示例。Scala 和 Clojure 可能属于这一类。

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

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

于 2009-10-12T10:41:16.487 回答
5

有没有人有函数式语言的例子,它们擅长执行实际任务或函数式语言最好执行的实际任务?

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

我们的业务主要靠销售 F# 编写的软件来赚钱,这些软件为从医疗设备的嵌入式软件到海事互联网服务提供商的许多领域的客户解决了实际问题。

于 2010-05-12T05:08:47.807 回答
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. 最后,Glasgow Haskell 编译器是用 Haskell 编写的。
于 2009-10-14T07:45:50.180 回答
4

有趣的是,你和我对“实际任务”的概念截然不同。你说它是:

接受请求,查找和处理请求的数据,并根据需要格式化返回

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

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

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

因此,总而言之,您所要求的答案是由衷的肯定,功能程序可以胜任这项任务。但是,您真正要寻找的答案是它比这要复杂一些。

于 2010-05-12T05:19:36.017 回答
3

你用过 LINQ 吗?

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

是的,F# 非常有用。

于 2010-07-06T08:50:20.720 回答
2

Erlang 以其健壮性和编写高并发服务器的特性而闻名。

它还有一个开箱即用的DBMS 。

于 2009-10-12T11:23:50.830 回答
2

现实世界中的函数式编程

于 2009-10-13T05:37:41.867 回答
2

基本上,我称之为“实用”的任务,例如

接受请求,查找和处理请求的数据,并根据需要格式化返回

你用 Erlang 做实验,在这种实用的描述下找不到适合它的实用任务?

接受请求。

你的意思是像receive。或者只是作为一个函数被直接调用。

查找和处理请求的数据。

我不完全确定您在这里的意思,但是对于查找数据,有文件 I/O、网络 I/O、(分布式)进程间通信等等等等。对于查找该数据的子集,有正则表达式,模式匹配等

对于处理,字符串、列表、数学、集合、图形等有一大堆东西。这还不够处理吗?你还在寻找什么?

根据需要将其格式化。

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

于 2010-05-12T05:18:09.123 回答
0

我不确定“实际任务”的定义及其所指的内容。但换句话说,我认为您正在谈论通过需要由编程语言表示的算法来解决问题。如果是这样,那么函数式语言是非常有用和实用的。特别是当你有时间找到解决方案并实施它时。对我来说,在参与解决复杂的算法竞赛(如Google CodeJam)时,我仍然使用非函数式语言。我正计划学习一种对我来说更适合这类任务或问题的函数式语言。

于 2010-11-11T11:05:48.637 回答