求教一道plc编程题目的题目

1您所在的位置: &
为什么说面向对象编程和函数式编程都有问题
为什么说面向对象编程和函数式编程都有问题
外刊IT评论
我不理解为什么人们会对面向对象编程和函数式编程做无休无止的争论。就好象这类问题已经超越了人类智力极限,所以你可以几个世纪的这样讨论下去。经过这些年对编程语言的研究,我已经清楚的看到了问题的答案,所以,我经常的发现,人们对这些问题做的都是一些抓不住要领、无意义的争论。
我不理解为什么人们会对面向对象编程和函数式编程做无休无止的争论。就好象这类问题已经超越了人类智力极限,所以你可以几个世纪的这样讨论下去。经
过这些年对编程语言的研究,我已经清楚的看到了问题的答案,所以,我经常的发现,人们对这些问题做的都是一些抓不住要领、无意义的争论。
简言之,不论是面向对象编程还是函数式编程,如果你走了极端,那都是错误的。面向对象编程的极端是一切都是对象(纯面向对象)。函数式编程的极端是纯函数式编程语言。
面向对象编程的问题
面向对象的问题在于它对&对象&的定义,它试图将所有事情就纳入到这个概念里。这种做法极端化后,你就得出来一个一切皆为对象思想。但这种思想是错误的,因为
& 有些东西不是对象。函数就不是对象。
也许你会反驳,在Python和Scala语言里,函数也是对象。在Python中,所有的含有一个叫做__call__的方法的对象其实都是函数。类似的,在Scala语言里,函数是拥有一个叫做apply方法的对象。但是,经过认真的思考后,你会发现,它混淆了源祖和衍生物的概念。函数是源祖,包含函数的对象实际是衍生物。__call__和apply它们自身首
先就是要定义的所谓&函数对象&。Python和Scala实际上是绑架了函数,把它们监禁在&对象&里,然后打上&__call__& 和
&apply& 标签,把它们称作&方法&。当然,如果你把一个函数封装到对象里,你可以像使用一个函数那样使用对象,但这并不意味着你可以说&函数也是对象&。
多数的面向对象语言里都缺乏正确的实现一等(first-class)函数的机制。Java语言是一个极致,它完全不允许将函数当作数据来传递。你可以将
全部的函数都封装进对象,然后称它们为&方法&,但就像我说的,这是绑架。缺乏一等函数是为什么Java里需要这么多&设计模式&的主要原因。一旦有了一
等函数,你将不再需要大部分的这些设计模式。
函数式编程的问题
相似的,函数式编程走向极端、成为一种纯函数式编程语言后,也是有问题的。为了讨论这个问题,我们最好先理解一下什么是纯函数式编程语言。出于这个目的,你可能需要阅读一下Amr Sabry先生(他是我的博士导师)的What is a Purely Functional Language。概述一下就是,纯函数式编程语言是错误的,因为
& 有些东西不是纯的。副作用是真实存在的。
所谓纯函数,基本上就是忽略了物质基础(硅片、晶体等)表现的特性。纯函数式的编程语言试图通过函数&&在函数中传入传出整个宇宙&&来重新实现整个宇宙。但物理的和模拟的是
有区别的。&副作用&是物理的。它们真实的存在于自然界中,对计算机的效用的实现起着不可或缺的作用。利用纯函数来模拟它们是注定低效的、复杂的、甚至是
丑陋的。你是否发现,在C语言里实现一个环形数据结构或随机数发生器是多么的简单?但使用Haskell语言就不是这样了。
还有,纯函数编程语言会带来巨大的认知成本。如果你深入观察它们,你会看到monads使程序变得复杂,难于编写,而且monad的变体都是拙劣的修改。monads跟Java的&设计模式&具有相同的精神本质。使用monad来
表现副作用就像是visitor模式来写解释器。你是否发现,在很多其它语言里很简单的事情,放到Haskell语言就变成了一个课题来研究如何实现?你
是否经常会看到一些有着诸如&用Monadic的方式解决一个已经解决的问题&这样标题的论文?有趣的是,Amr Sabry先生一起合著了这样一篇论文。他试图用Haskell语言重新实现Dan Friedman的miniKanren,但他不知道如何构造这些monads。
他向Oleg Kiselyov&&公认的世界上对Haskell类型系统知识最渊博的人&&求教。而且你可能不知道,Amr
Sabry先生应该是世界上对纯函数编程语言知识最渊博的人了。他们在 Oleg 的帮助下解决了疑难后一起合著了这篇论文。讽刺的是,Dan
Friedman&&这个程序的原作者&&在使用Scheme语言开发时却没有遇到任何问题。我在Dan的代码基础上重新实现了miniKanren,增
加了一个复杂的负操作。为了实现这个,我需要使用约束式逻辑编程和其它一些高级的技巧。鉴于用Haskell语言重写基本的miniKanren将两位世界级程序员都难倒了的事实,我不敢想象如果用Haskell的monads如何能实现这些。
有些人认为monads的价值在于,它们&圈定&了副作用的范围。但如果monads不能真正的使程序变得易于分析或更安全,这种&圈定&有什么用呢?事实上就是没用处。本身就跟副作用一样难于分析理解。没有一种东西可以说monads能使其简单而静态分析办不到的。所有的静态分析研究者都知道这点。静态分析利用了monads的本质,但却去除了程序员编写monads代码的负担&&而不是增加负担。当然,过度的副作用会使程序很难分析,但你也可以使用C语言写出纯函数,例如:
int&f(int&x)&{&&&&&int&y&=&0;&&&&&int&z&=&0;&&&&&y&=&2&*&x;&&&&&z&=&y&+&1;&&&&&return&z&/&3;&}&&&
你用汇编语言也能做到这些。纯函数并不专属于纯函数式编程语言。你可以用任何语言写出纯函数,但重要的是,你必须也应该允许副作用的存在。
首历史,你会发现,数学上的理想主义是纯函数编程语言的背后推动力。数学函数简单漂亮,但不幸的是,它们只是在你构建原始纯粹的模型时才好用。否者它们会
变得很丑陋。不要被&范畴论&等标语吓倒。我对范畴论了解很多。即使是范畴理论学家自己也称其为&抽象无意义&,因为它们基本上就是用一种怪诞的方式告诉
你一些你已经知道的事情!如果你读过Gottlob Frege的文章Function and concept,你会吃惊的发现,在他的这篇论文前的大多数数学家都错误的理解了函数,而这仅仅是刚刚100多年前的事。事实上,数学语言上的很多事情都是有问题的。特别是微积分方面。编程语言的设计者们没有理由要盲目的学习数学界。
不要盲目的爱上你的模型
论任何事情,当走向极端时都是有害的。极端化时,面向对象编程和函数式编程都试图把整个世界装入它们的特有模型中,但这个世界是在完全不依赖我们的大脑思
考的情况下运转的。如果以为你有一个锤子,就把所有东西都当成钉子,这明显是不对的。只有通过认清我们的真实世界,才能摆脱信仰对我们的束缚。
& 不要让世界适应你的模型。让你的模型适应世界。
原文链接:
译文链接:【编辑推荐】【责任编辑: TEL:(010)】
关于&&的更多文章
在过去的近十年的时间里,面向对象编程大行其道。以至于在大学的
网友评论TOP5
本次的专刊为大家提供了Oracle最新推出的Java SE 8详细的开发教程,从解读到探究Java 8最新
讲师: 0人学习过讲师: 31人学习过讲师: 50人学习过
如何看将流行的JavaScript MVC框架Ember.js? 这款Java
一周一周的过的很快,2013年已经进入了倒计时。开发频
在脚本语言领域,Lua是最快、最高效的脚本语言之一,
本书详细介绍了在最新Tomcat 5版本上开发Java Web应用的各种技术。主要内容包括:Tomcat和Java Web开发的基础知识,Java Web开发
51CTO旗下网站求教一个iis发布程序的问题
[问题点数:40分,结帖人as198645]
求教一个iis发布程序的问题
[问题点数:40分,结帖人as198645]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第四
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。求教一道C程序题_百度知道
求教一道C程序题
编写一个C语言程序,要求实现的功能为:从键盘上输入一行缉範光既叱焕癸唯含沥带有英文字母的任意字符串,假定该字符串的长度不超过50,试统计出该串中所包含的每一种字母a、b、c、d的个数(字母大小写等效),并分行依次输出,每行的输出格式为“字母:个数”,如假定字母a的个数为3,则输出格式为“a: 3”。提示:请在for循环内使用switch语句分别进行字母个数的统计
提问者采纳
#include&stdio.h&int main(){ char s[50]; int num_a,num_b,num_c; num_a=0; num_b=0; num_c=0; int i=0; do {
scanf(&%c&,&s[i]);
i++; } while(s[i-1]!='\n'); s[i+1]='\0'; for(i=0;s[i]!='\0';i缉範光既叱焕癸唯含沥++) {
switch(s[i])
case'a':num_a++;
case'A':num_a++;
case'b':num_b++;
case'B':num_b++;
case'c':num_c++;
case'C':num_c++;
} } printf(&a:%d\n&,num_a); printf(&b:%d\n&,num_b); printf(&c:%d\n&,num_c); return 0;}经过调试 望采纳!!
其他类似问题
为您推荐:
c程序的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁共有 611 人关注过本帖
标题:递归函数编程题做不出来,求教
等 级:论坛游民
帖 子:21
专家分:15
结帖率:37.5%
&&已结贴√
&&问题点数:20&&回复次数:8&&&
递归函数编程题做不出来,求教
有一道编程题要求用递归函数输出下列值:
我做完以后编译通过,但是什么值也没有,不知道错在什么地方了
#include &stdio.h&
int a(int i)
&&& return i=a(i);
&&&int i,n=5,j,b;
&&&for(i=1;i&=n;i++)
&&&&&&for(j=1;j&n-i;j++)
&&&&&&printf(& &);
&&&&&&for(j=1;j&i+1;j++)
&&&&&&printf(&%d&,a(j));
&&&&&&for(j=i;j&0;j--)
&&&&&&&&b=a(a(j)-1);
&&&&&&&&printf(&%d&,b);
&&& printf(&\n&);&&
&&&}&&&&&&&&
搜索更多相关主题的帖子:
等 级:贵宾
威 望:53
帖 子:3719
专家分:10834
用到递归时一定要想到递归结束的条件,请问楼主函数a结束递归的条件是什么?
总有那身价贱的人给作业贴回复完整的代码
有没有北京回龙观和海淀地区想好好学C语言的?最近家里负担重,而且有点业余时间,想有偿带人入门。我本人也就是入门水平(太高精尖的不会哈),只是经验多一些,可以让你少走弯路。qq:
等 级:论坛游民
帖 子:21
专家分:15
a(i)中的i为0时,程序就退出了吧
等 级:贵宾
威 望:53
帖 子:3719
专家分:10834
i怎么等于0?等于0退出你写了吗?
总有那身价贱的人给作业贴回复完整的代码
有没有北京回龙观和海淀地区想好好学C语言的?最近家里负担重,而且有点业余时间,想有偿带人入门。我本人也就是入门水平(太高精尖的不会哈),只是经验多一些,可以让你少走弯路。qq:
等 级:职业侠客
帖 子:223
专家分:399
//那个函数去掉吧
&&& int i,n=5,j,b;
&&& for(i=1;i&=n;i++)
&&&&&&&&for(j=1;j&=n-i;j++)
&&&&&&&&&&&&printf(& &);
&&&&&&&&for(j=1;j&=i;j++)
&&&&&&&&&&&&printf(&%d&,j);
&&&&&&&&for(j=i-1;j&0;j--)
&&&&&&&&&&&&b=j;
&&&&&&&&&&&&printf(&%d&,b);
&&&&&&&&printf(&\n&);&&
&&& }&&&&&&&&
等 级:版主
威 望:93
帖 子:3150
专家分:12172
理解一下这段代码,你就明白embed_xuel说的是什么了。不知道这是不是你想要的递归方式。
程序代码:#include&stdio.h&
void output(int space, int n)
&&& if(n == <font color=#) return;
&&& output(space + <font color=#, n - <font color=#);
&&& for(i = <font color=#; i & i++) putchar(' ');
&&& for(i = <font color=#; i & printf(&%d&, i++));
&&& for(; i & <font color=#; printf(&%d&, i--));
&&& puts(&&);
int main()
&&& int n = <font color=#;
&&& output(<font color=#, n);
&&& return <font color=#;
重剑无锋,大巧不工
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
回复 6楼 beyondyf
杨大哥&&小弟折服
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
===========深入&-----------------&浅出============
等 级:论坛游民
帖 子:21
专家分:15
明白了。只不过c语言我以前只学过二级考试,学
得浅,你的这套代码我是编不出来的。不过我看过后,
怎么感觉打印出来的是倒三角呢
等 级:版主
威 望:93
帖 子:3150
专家分:12172
明白了怎么会感觉是倒三角呢?
代码是用来编译执行的,不是用来感觉的。
重剑无锋,大巧不工
版权所有,并保留所有权利。
Powered by , Processed in 0.024467 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights ReservedVC的一道编程题_百度知道
VC的一道编程题
=51,则;stdio,该项的数值是2*i-1;void main(){int i.-9+101然后让求和 我的想法是,我这个程序需要怎么修改才能正确啊。答案应该是51的,偶数项是负。我的程序是这样的!=0)
k=k+(2*i-1);}到最后为什么还是不对啊;for(i=1。#include&lt,第一位是奇数位, k=0题目是这样的1-3+5-7+,奇数项是正。求教啊, k).; i&lt.h&;
k=k-(2*i-i);}printf(&n&%d&#92; i=i++){
if ((i%2).,第二位是偶数位。希望大神能来解答下,如果i是项数
for(j=3, j, m=0.h& i+=4)
m+=i;n&}这个这能求出, void main(){
printf(&sum=%d&#92;102, n=0;102;
sum = m-n; i&lt,sum)#include & j&
其他类似问题
20人觉得有用
为您推荐:
其他4条回答
for(i=1;%d &#92;n&
else sum=sum+ void main(){ int sum = 0#include &; i&lt,stdio,sum); }printf(&
if(i%2 == 0) sum=sum- i++) {
temp = 2*i-1;52.h&gt
if ((i%2)!=0)k=k+(2*i-1);//如果i是奇数,执行这句elsek=k-(2*i-i);//如果i是偶数,执行这句= =||| 这和题目不一样吧、、、
就是想问按照我这个思路,按位置来算,这个程序改怎么写呢?
if ((i%2)!=0)k=k+(2*i-1);elsek=k-(2*i-i);&#47;&#47;这句写错了,2*i-1
if ((i%2)!=0)
k=k+(2*i-1);
k=k-(2*i-i);}应该是k=k-(2*i- 1),
看在这么努力看你程序的份上, 采纳吧
k=k-(2*i - i)
-i 粗心大意}
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 java编程题目 的文章

 

随机推荐