时间:2015-6-4来源:本站原创作者:佚名

函数式编程十分容易并行,因为它在运行时不会修改任何状态,因此无论多少线程在运行时都可以观察到正确的结果

{

if (p.unitprice >= 20)

list result = new list(groups.values);

x.productcountp.unitprice >= 20)

group p by p.categoryname into g

}

let mutable acc = 0

var result =

let sumsquaresi l =

for x in l do

编译器会简单地将linq差距语句转化为前一种形式这段代码只是表现出最终的目的,而不是明确指定做事的方式,这样便可以很容易地并行执行这段代码,如使编程语言特性用pinq则几乎不需要做出任何修改

groups[p.categoryname].productcount++;

使用命令式编程语言写程序时,我们经常会编写如x = x + 1这样的语句,此时我们大量依赖的是可变状态,或者说是“变量”,它们的值可以随程序运行而改变可变状态非常强大,但随之而来的便是被称为“副作用”的问题,例如一个无需参数的void方法,它会根据调用次数或是在哪个线程上进行调用对程序产生影响,它会改变程序内部的状态,从而影响之后的运行效果而在函数式编程中则不会出现这个情况,因为所有的状态都是不可变的事实上对函数式编程的讨论更像是数学、公式,而不是编程语言的版本区别程序语句,如x = x + 1对于数学家来说,似乎只是个永不为真的表达式而已

| head :: tail -> sqr head + sumsquaresf tail

}

r.productcount = 0;

return

{

r.categoryname = p.categoryname;

这段代码更加关注的是“what”而不是“how”,它不会明确地给出过滤的“操作方式”,也没有涉及到创建字典这样的细节这段代码还可以利用c# 3.0中内置的dsl,即linq查询语句来改写:

dsl的可读性往往很高例如,要筛选出单价大于20的产品,并对所属种类进行分组,并降序编程语言特性地列出每组的分类名称及产品数量如果是用命令式的编程方式,则可能是这样的:dictionary groups = new dictionary();

acc0

from p in products

if (!groups.containskey(p.categoryname))

x.productcount > y.productcount ? -1 :

orderby g.count() descending

.groupby(p => p.categoryname)

result.sort(delegate(grouping x, grouping y)

在数学里我们经常使用递归,把一个公式分解成几个变化的形式,以此进行递归的定义纯函数式的代编程语言技术应用码其“数学性”较强,如果您分析上面这段代码,会发现它几乎就是标准的数学定义在编程时我们也使用递归的做法,编译器会设法帮我们转化成尾调用或是循环语句假如两个函数完全无关,那么它们是并行还是顺序地执行便没有什么区别了当然,现实中的程序一定是有副作用的,例如向屏幕输出内容,向socket传输数据等等,因此真实世界中的函数式编程往往都会考虑如何将有副作用的代码分离出来函数式编程默认是不可变的,开发人员必须做些额外的事情才能使用可变状态或是危险的副作用,与之相反,如c#或java必须使用readonly或是final来做到这一点此时,使用函数式编程语言时的思维观念便会有所不同了

.ord编程语言开发erbydescending(g => g.count())

   

{

{

}

groups[p.categoryname] = r;

函数式编程

f#是微软随vs 2010推出的一门函数式编程语言,它基于ocaml的核心部分,因此是一门强类型编程语言,并支持一些如模式匹配,类型推断等现代函数式编程语言的特性在此之上,f#又增加了异步工作流,度量单位等较为前沿的语言功能在f#中如果要计算一个列表所有元素之和,也可以使用命令式的风格来编写代码:

grouping r = new grouping();

where p.unitprice >= 20

select new { categoryname = g.key, productcount =编程语言优势 g.count() };

anders提出的另一个重要的声明式编程方式便是函数式编程函数式编程历史悠久,它几乎和编程语言本身同时诞生,如当年的lisp便是个函数式编程语言除了lisp以外还有其他许多函数式编程语言,如apl、haskell、ml等等关于函数式编程在学术界已经有过许多研究了,大约在5到10年前许多人开始吸收和整理这些研究内容,想要把它们融入更为通用的编程语言现在的编程语言,如c#、python、ruby、scala等等,它们都受到了函数式编程语言的影响

foreach (product p in products)

.select(g => new { categoryname = g.key, pro编程语言特性ductcount = g.count() });


白癜风图像
白癜风的专科专家
转载请注明原文网址:http://www.gzdatangtv.com/cksc/241.html
------分隔线----------------------------