网站历史记录怎么恢复wordpress 推酷
web/
2025/9/25 13:18:57/
文章来源:
网站历史记录怎么恢复,wordpress 推酷,官方商城下载,wordpress 去除底部关于声明式编程的还有一部分重要的内容#xff0c;那便是函数式编程。函数式编程已经有很长时间的历史了#xff0c;当年LISP便是个函数式编程语言。除了LISP以外我们还有其他许多函数式编程语言#xff0c;如APL、Haskell、Scheme、ML等等。关于函数式编程在学术界已经有过… 关于声明式编程的还有一部分重要的内容那便是函数式编程。函数式编程已经有很长时间的历史了当年LISP便是个函数式编程语言。除了LISP以外我们还有其他许多函数式编程语言如APL、Haskell、Scheme、ML等等。关于函数式编程在学术界已经有过许多研究了在大约5到10年前许多人开始吸收和整理这些研究内容想要把它们融入更为通用的编程语言。现在的编程语言如C#、Python、Ruby、Scala等等它们都受到了函数式编程语言的影响。 我想在这里先花几分钟时间简单介绍一下我眼中的函数式编程语言。我发现很多人听说过函数式编程语言但还不十分清楚它们和普通的命令式编程语言究竟有什么区别。如今我们在使用命令式编程语言写程序时我们经常会写这样的语句嗨x等于x加一此时我们大量依赖的是状态可变的状态或者说变量它们的值可以随程序运行而改变。 可变状态非常强大但随之而来的便是叫做“副作用”的问题。在使用可变状态时你的程序则会包含副作用比如你会写一个无需参数的void方法然后它会根据你的调用次数或是在哪个线程上进行调用对程序产生影响因为void方法会改变程序内部的状态从而影响之后的运行效果。 而在函数式编程中则不会出现这个情况因为所有的状态都是不可变的。你可以声明一个状态但是不能改变这个状态。而且由于你无法改变它所以在函数式编程中不需要变量。事实上对函数式编程的讨论更像是数学、公式而不像是程序语句。如果你把x x 1这句话交给一个程序员看他会说“啊你在增加x的值”而如果你把它交给一个数学家看他会说“嗯我知道这不是true”。 然而如果你给他看这条语言他会说“啊y等于x加一就是把x 1的计算结果交给y你是为这个计算指定了一个名字”。这时候在思考时就是另一种方式了这里y不是一个变量它只是x 1的名称它不会改变永远代表了x 1。 所以在函数式编程语言中当你写了一个函数接受一些参数那么当你调用这个函数时影响函数调用的只是你传进去的参数而你得到的也只是计算结果。在一个纯函数式编程语言中函数在计算时不会对进行一些神奇的改变它只会使用你给它的参数然后返回结果。在函数式编程语言中一个void方法是没有意义的它唯一的作用只是让你的CPU发热而不能给你任何东西也不会有副作用。当然现在你可能会说这个CPU发多少热也是一个副作用好吧不过我们现在先不讨论这个问题。 这里的关键在于你解决问题的方法和以前大不一样了。我这里还是用代码来说明问题。使用函数式语言写没有副作用的代码就好比在Java或C#中使用final或是readonly的成员。 例如这里我们有一个Point类构造函数接受x和y还有一个MoveBy方法可以把一个点移动一些位置。 在传统的命令式编程中我们会改变Point实例的状态这么做在平时可能不会有什么问题。但是如果我把一个Point对象同时交给3个API使用然后我修改了Point那么如何才能告诉它们状态改变了呢可能我们可以使用事件blablabla如果我们没有事件那么就会出现那些不愉快的副作用了。 那么使用函数式编程的形式写代码你的Point类还是可以包含状态例如x和y不过它们是readonly的一旦初始化以后就不能改变了。MoveBy方法不能改变Point对象它只能创建一个新的Point对象并返回出来。这就是一个创建新Point对象的函数不是吗这样就可以让调用者来决定是使用新的还是旧的Point对象但这里不会有产生副作用的情况出现。 在函数式编程里自然不会只有Point对象例如我们会有集合如DictionaryMapList等等它们都是不可变的。在函数式编程中当我们向一个List里添加元素时我们会得到一个新的List它包含了新增的元素但之前的List依然存在。所以这些数据结构的实现方式是有根本性区别的它们的内部结构会设法让这类操作变的尽可能高效。 在函数式编程中访问状态是十分安全的因为状态不会改变我可以把一个Point或List对象交给任意多的地方去访问完全不用担心副作用。函数式编程的十分容易并行因为我在运行时不会修改状态因此无论多少线程在运行时都可以观察到正确的状态。两个函数完全无关因此它们是并行还是顺序地执行便没有什么区别了。我们还可以有延迟计算可以进行Memorization这些都是函数式编程中十分有趣的方面。 你可能会说那么我们为什么不都用这种方法来写程序呢嗯最终就像我之前说的那样我们不能只让CPU发热我们必须要把计算结果表现出来。那么我们在屏幕上打印内容时或者把数据写入文件或是Socket时其实就产生了副作用。因此真实世界中的函数式编程往往都是把纯粹的部分进行隔离或是进行更细致的控制。事实上也不会有真正纯粹的函数式编程语言它们都会带来一定的副作用或是命令式编程的能力。但是它们默认是函数式的例如在函数式编程语言中所有东西默认都是不可变的你必须做些额外的事情才能使用可变状态或是产生危险的副作用。此时你的编程观念便会有所不同了。 我们在自己的环境中开发出了这样一个函数式编程语言F#已经包含在VS 2010中了。F#诞生于微软剑桥研究院由Don Syme提出他在F#上已经工作了5到10年了。F#使用了另一个函数式编程语言OCaml的常见核心部分因此它是一个强类型语言并支持一些如模式匹配类型推断等现代函数式编程语言的特性。在此之上F#又增加了异步工作流度量单位等较为前沿的语言功能。 而F#最为重要的一点可能是在我看来它是第一个和工业级的框架和工具集如.NET和Visual Studio有深入集成的函数式编程语言。F#允许你使用整个.NET框架它和C#也有类似的执行期特征例如强类型而且都会生成高效的代码等等。我想现在应该是展示一些F#代码的时候了。 首先我想先从F#中我最喜欢的特性讲起这是个F#命令行……打开命令行窗口以及一个F#源文件……F#包含了一个交互式的命令行这允许你直接输入代码并执行。例如输入5……x等于5……然后x……显示出x的值是5。然后让sqr x等于x乘以x于是我这里定义了一个简单的函数名为sqr。于是我们就可以计算sqr 5等于25sqr 10等于100。 F#的使用方式十分动态但事实上它是一个强类型的编程语言。我们再来看看这里。这里我定义了一个计算平方和的函数sumSquares它会遍历每个列表中每个元素平方后再把它们相加。让我先用命令式的方式编写这个函数再使用函数式的方式这样你可以看出其中的区别。 let sumSquaresI l let mutable acc 0 for x in l do acc - acc sqr xacc 这里先是命令式的代码我们先创建一个累加器acc为0然后遍历列表l把平方加到acc中然后最后我返回acc。有几件事情值得注意首先为了创建一个可变的状态我必须显式地使用mutable进行声明在默认情况下这是不可变的。 还有一点这段代码里我没有提供任何的类型信息。当我把鼠标停留在方法上时就会显示sumSquaresI方法接受一个int序列作为参数并返回一个int。你可能会想int是哪里来的嗯它是由类型推断而来的。编译器从这里的0发现acc必须是一个int于是它发现这里的加号表示两个int的相加于是sqr函数返回的是个int再接下来blablabla……最终它发现这里到处都是int。 如果我把这里修改为浮点数0.0鼠标再停留一下你就会发现这个函数接受和返回的类型都变成float了。所以这里的类型推断功能十分强大也十分方便。 现在我可以选择这个函数让它在命令行里执行然后调用sumSquaresI提供1到100的序列就能得到结果了。 let rec sumSquaresF l match l with | [] - 0| h :: t - sqr h sumSquaresF t 那么现在我们来换一种函数式的风格。这里是另一种写法可以说是纯函数式的实现方式。如果你去理解这段代码你会发现有不少数学的感觉。这里我定义了sumSqauresF函数输入一个l列表然后使用下面的模式去匹配l。如果它为空则结果为0否则把列表匹配为头部和尾部然后便将头部的平方和尾部的平方和相加。 你会发现在计算时我不会去改变任何一个变量的值我只是创建新的值。我这里会使用递归就像在数学里我们经常使用递归把一个公式分解成几个变化的形式以此进行递归的定义。在编程时我们也使用递归的做法然后编译器会设法帮我们转化成尾递归或是循环等等。 于是我们便可以执行sumSquaresF函数也可以得到相同的结果。当然实际上可能你并不会像之前这样写代码你可能会使用高阶函数 let sumSquares l Seq.sum (Seq.map (fun x - x * x) l ) 例如这里我只是把函数x乘以x映射到列表上然后相加。这样也可以得到相同的结果而且这可能是更典型的做法。我这里只是想说明这个语言在编程时可能会给你带来完全不同的感受虽然它的执行期特征和C#比较接近。 这便是关于F#的内容。 原文链接http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81640.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!