Functional programming 函数式编程语言适合于实际任务吗?

Functional programming 函数式编程语言适合于实际任务吗?,functional-programming,scientific-computing,Functional Programming,Scientific Computing,从我对Haskell、Erlang和Scheme的实验来看,函数式编程语言是回答科学问题的一种极好的方式。例如,获取一小部分数据并对其进行广泛分析,以返回一个重要的答案。这对于解决一些棘手的项目问题或以一种独创的方式尝试谷歌代码阻塞非常有用 同时,就其本质而言,他们似乎更适合于寻找解析解,而不是实际执行实际任务。我在Haskell中特别注意到了这一点,在Haskell中,一切都是惰性地评估的,您的整个程序可以归结为一个针对某些给定数据的巨大分析解决方案,您可以将这些数据硬编码到程序中,也可以通过

从我对Haskell、Erlang和Scheme的实验来看,函数式编程语言是回答科学问题的一种极好的方式。例如,获取一小部分数据并对其进行广泛分析,以返回一个重要的答案。这对于解决一些棘手的项目问题或以一种独创的方式尝试谷歌代码阻塞非常有用

同时,就其本质而言,他们似乎更适合于寻找解析解,而不是实际执行实际任务。我在Haskell中特别注意到了这一点,在Haskell中,一切都是惰性地评估的,您的整个程序可以归结为一个针对某些给定数据的巨大分析解决方案,您可以将这些数据硬编码到程序中,也可以通过Haskell有限的IO功能混乱地附加到程序中

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

Aceept a request, find and process requested data, and return it formatted as needed a接受请求,查找并处理请求的数据, 并根据需要将其格式化返回 似乎更直接地翻译成过程语言。我最幸运的发现了一种像Factor这样工作的函数式语言,我把它比作Python的反向波兰符号版本


所以我只是好奇我是否在这些语言中遗漏了一些东西,或者我问这个问题的方式太离谱了。有没有人举过函数式语言的例子,这些语言擅长于执行实际任务,或者函数式语言能够最好地执行实际任务?

关于语言,我认为F#是一种主要是“函数式”但也“实用”的语言的例子。Scala和Clojure可能是这一类中的其他人

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


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

Erlang以其健壮性和编写高度并发服务器的功能而闻名


它还有一个现成的方案。

在我看来,该方案过于简单,不具有实用性——它被用于几门教学课程(参见计算机程序的结构和解释)。然而,像Common Lisp这样的现代Lisp语言,尤其是Clojure,正变得越来越重要。Erlang被几个大型行业用于高并发应用程序,我个人还没有看到终端用户程序员使用它。另一方面,Haskell是一种相当真实的语言,已经被用来编写许多优秀的软件,包括:

  • XMonad是一个纯粹用Haskell编写的X窗口系统窗口管理器
  • Leksah,Haskell的IDE是用Haskell本身编写的
  • 帕格斯是Perl 6的主要实现之一,是用Haskell编写的
  • 最后,格拉斯哥Haskell编译器是用Haskell编写的
  • 有没有人举过函数式语言的例子,这些语言擅长于执行实际任务,或者说函数式语言最适合执行实际任务

    我们的业务以F#代码为基础,从在线信用卡交易到网络分析无所不包。这些LOB应用程序由微小的F#脚本组成,这些脚本使用.NET对Outlook和Excel等应用程序的无缝互操作和自动化,可以快速、简单地完成所有需要的操作

    我们的业务主要是销售用F#编写的软件,为来自多个行业的客户解决实际问题,从医疗设备的嵌入式软件到海事互联网服务提供商

    基本上,我称之为 “实用”如

    Aceept a request, find and process requested data, and return it formatted as needed a接受请求,查找并处理 请求的数据,并将其返回 根据需要格式化

    您尝试过Erlang,但在下面的实用任务描述中找不到它的实用任务

    接受请求

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

    查找并处理请求的数据

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

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

    根据需要将其格式化返回


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

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

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

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

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

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

    总之,你想要的答案是发自内心的是,功能程序可以胜任这项任务。你真正想要的答案是什么