Functional programming 动态语言和函数语言之间有什么区别?

Functional programming 动态语言和函数语言之间有什么区别?,functional-programming,dynamic-languages,Functional Programming,Dynamic Languages,我经常发现开发人员同时使用函数式语言和动态语言这两个术语,我想知道为什么它们总是放在一起。 它们之间有什么区别?一种语言能同时具有动态性和功能性吗?它们相互补充吗?我们为什么需要它们呢? 我是一名C#程序员,还不了解整个动态/功能(C#将在第4版中具有一些动态特性。它是否也具有功能?这里发生了什么?) 谢谢, Abraham动态类型是一种类型系统,与“函数式”编程范式正交 动态“语言”实际上是动态类型化的。这意味着您没有对变量类型进行编译时检查 函数语言为lambda演算等匿名函数提供了大量支持

我经常发现开发人员同时使用函数式语言和动态语言这两个术语,我想知道为什么它们总是放在一起。 它们之间有什么区别?一种语言能同时具有动态性和功能性吗?它们相互补充吗?我们为什么需要它们呢? 我是一名C#程序员,还不了解整个动态/功能(C#将在第4版中具有一些动态特性。它是否也具有功能?这里发生了什么?)

谢谢,
Abraham

动态类型是一种类型系统,与“函数式”编程范式正交

动态“语言”实际上是动态类型化的。这意味着您没有对变量类型进行编译时检查

函数语言为lambda演算等匿名函数提供了大量支持

执行动态类型并支持匿名函数的语言示例:javascript。Ruby也有一些功能风格支持。还有其他问题。

用一个简单(但不准确)的答案来回答

  • 类型(类的名称)与它的死敌静态类型语言相比并不重要。一个变量在任何给定的时间点都可能有不同类型的对象分配给它。方法调用在运行时解析。这意味着您将失去静态键入的好处(编译器警告),但简单方法将变为泛型-
    排序(list)
    适用于字符串列表和int列表。e、 g.鲁比等人
  • 价值不变性。这些程序是按照越来越大的函数编写的(通常是自下而上的)。对象状态和可变性的概念是不受欢迎的。在这种情况下,功能是自给自足的(这个术语在维基百科中是纯粹的):它产生输出所需要的一切,都在于它接收到的输入。它也不会产生副作用(除非它明确提到),并为给定的输入返回一致的输出。这可以产生优雅的代码(参见:fluent interfaces),其中输入数据通过diff函数管道化,以产生最终输出,例如LISP et.all
然而,由于语言选择了世界上最好的语言,边界变得模糊。。。您可以同时使用两种语言,一种或两种都不使用。

e、 g.主要是静态C#在3.0中提取lambda表达式,并在4.0中引入动态功能,xtofl已经提供了一个很好的总体情况。我可以直截了当地说

一段时间以来,C#以功能性的方式变得越来越容易使用:

  • C#2引入了匿名方法,这使得创建使用状态的委托变得更容易,而状态对于方法来说是本地的
  • C#3引入了lambda表达式,这些表达式大部分类似于匿名方法,但更紧凑
  • C#3和.NET3.5中对LINQ的支持使得以函数方式查询数据变得更容易,将谓词、投影等链接在一起
  • C#4特性中没有一个直接有助于IMO函数式编程,尽管命名参数和可选参数可能会使创建/使用不可变类型变得更容易,这是IMO函数图中缺失的最大特性之一
(函数式语言通常还有其他功能,例如模式匹配和更令人印象深刻的类型推断,但您可以在C#中相当轻松地编写许多函数式代码。)

C#4将通过
dynamic
类型获得一些动态能力(它本身实际上是一种静态类型,您可以使用它做任何事情)。这在某种程度上是“选择加入”——如果你从不使用
动态类型,C#仍然是完全静态的语言。动态响应没有语言支持,但DLR对此有支持—例如,如果实现
IDynamicMetaObjectProvider
或从
DynamicObject
派生,则可以添加动态行为


我想说的是,C#并没有成为一种功能性语言或动态语言,而是一种可以以功能性风格编写代码并与动态平台交互的语言。

如果您对范例感兴趣,本文将介绍它们

在函数式编程中,状态是隐式的——程序通过调用调用其他函数的函数来执行。在命令式编程和面向对象编程中,状态是显式的——您可以更改变量或对象字段的值

在某种程度上,功能性系统和命令性系统可以看作是双重的——一个系统中固定的是另一个系统中的动态值

闭包——它在对象中捕获一些显式的、可变的状态,这些状态可以作为函数调用——介于两者之间,既不是纯函数编程,也不是完全成熟的对象;它们更像是匿名对象,而不是函数

“动态语言”是一个模糊的术语,通常指以下其中一种:

  • 动态类型语言-将类型确定延迟到运行时的语言,但类型集是固定的。例如Smalltalk、Lisps和当前的Fortress实现。一些静态类型语言也允许一些动态类型检查——java、C++、C++和艾达。(导致Ariane 5崩溃的是Ada中从float到int的动态类型转换失败)

  • 具有动态类型的语言—可以在运行时创建新类型的语言。最流行的是JavaScript。因为您必须运行程序来确定类型,所以很难为这些类型创建具有类型感知自动完成功能的IDE

  • 动态编译的语言—可以在运行时编译新脚本的语言。在页面级别上,bash、JSP、PHP和ASP都是如此,而在更精细的级别上,lisp和JavaScript支持“eva”
    |----------------+---------+---------|
    |                | Dynamic | Static  |
    |----------------+---------+---------|
    | Functional     | LISP    | Haskell |
    | Not functional | PHP     | Java    |
    |----------------+---------+---------|