Functional programming 动态语言和函数语言之间有什么区别?
我经常发现开发人员同时使用函数式语言和动态语言这两个术语,我想知道为什么它们总是放在一起。 它们之间有什么区别?一种语言能同时具有动态性和功能性吗?它们相互补充吗?我们为什么需要它们呢? 我是一名C#程序员,还不了解整个动态/功能(C#将在第4版中具有一些动态特性。它是否也具有功能?这里发生了什么?) 谢谢,Functional programming 动态语言和函数语言之间有什么区别?,functional-programming,dynamic-languages,Functional Programming,Dynamic Languages,我经常发现开发人员同时使用函数式语言和动态语言这两个术语,我想知道为什么它们总是放在一起。 它们之间有什么区别?一种语言能同时具有动态性和功能性吗?它们相互补充吗?我们为什么需要它们呢? 我是一名C#程序员,还不了解整个动态/功能(C#将在第4版中具有一些动态特性。它是否也具有功能?这里发生了什么?) 谢谢, Abraham动态类型是一种类型系统,与“函数式”编程范式正交 动态“语言”实际上是动态类型化的。这意味着您没有对变量类型进行编译时检查 函数语言为lambda演算等匿名函数提供了大量支持
Abraham动态类型是一种类型系统,与“函数式”编程范式正交 动态“语言”实际上是动态类型化的。这意味着您没有对变量类型进行编译时检查 函数语言为lambda演算等匿名函数提供了大量支持 执行动态类型并支持匿名函数的语言示例:javascript。Ruby也有一些功能风格支持。还有其他问题。用一个简单(但不准确)的答案来回答
- 类型(类的名称)与它的死敌静态类型语言相比并不重要。一个变量在任何给定的时间点都可能有不同类型的对象分配给它。方法调用在运行时解析。这意味着您将失去静态键入的好处(编译器警告),但简单方法将变为泛型-
适用于字符串列表和int列表。e、 g.鲁比等人排序(list)
- 价值不变性。这些程序是按照越来越大的函数编写的(通常是自下而上的)。对象状态和可变性的概念是不受欢迎的。在这种情况下,功能是自给自足的(这个术语在维基百科中是纯粹的):它产生输出所需要的一切,都在于它接收到的输入。它也不会产生副作用(除非它明确提到),并为给定的输入返回一致的输出。这可以产生优雅的代码(参见: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函数图中缺失的最大特性之一
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 |
|----------------+---------+---------|