avatar
Scala有一点不好# Programming - 葵花宝典
b*g
1
RT
是必须回国签F2过来吗?
如果境内转失败了 回去签是不是会受影响啊?
有没有方法可以不用回国签的?
谢谢
avatar
R*n
2
【 以下文字转载自 SanFrancisco 讨论区 】
发信人: RichPerson (我爱中科大~ 赚钱专业户~), 信区: SanFrancisco
标 题: 影评《让子弹飞》的暗线,隐喻。豆瓣浏览达8万多人的帖子
发信站: BBS 未名空间站 (Thu Dec 23 23:58:03 2010, 美东)
“由于对姜文过于卑躬屈膝,厚颜无耻的吹捧,该影评已被和谐。”
这句是我在去看电影之前,已经准备好的影评(还是抄来的)。
吾辈俗人,花钱去影院只图消遣。回来吹吹水,网上吐吐槽。严肃客观的
评价电影于我如浮云,就是带着这么强烈的偏见去看的电影。国产片导演就那么几位。
考虑到他们近年的发挥惊人地稳定, 吾辈观影前,早已选择好了态度。
比如赵氏孤儿,陈凯歌肯定给我们带来悲剧。他就活在自己的那点小悲剧情怀里
,老想拍一悲剧,还肯定又玩现了,整个一纯悲剧。我们买了电影票,聚精会神地盯着
屏幕,唯恐事后骂得不够尖刻戏谑不够振聋发聩。 再比如让子弹飞, 姜文肯定给我们
带来惊喜。我们买了电影票,就等着让他TMD给我们翻译翻译什么叫TMD的惊喜。 看不
懂,就说这片真有深度,可惜太小众了。 看懂了,便把他当神来捧,唯恐自己的态度
不够卑贱,拜倒得不够迅猛。 只恨“愿为姜文门下走狗”这种结构已在王小波徐文长
身上用滥了。
人总是渴求被认同。所谓“人生得一知己,死而无憾”,描绘的就是这种
渴求被满足时的快感。人性若此,无以抗衡。这群大导演大玩家,亦不能脱俗,只是口
味略有偏好。冯小刚张艺谋什么的活明白了,追求票房认同。陈凯歌自负才华,追求带
点文艺腔的装B青年的认同。吾辈小装青年,层次低,为与不装B的大众拉开差距,大家
紧紧抱成鸡蛋状,追求蛋内认同,人称蛋同。还有些大装青年,最爱唱反调,追求与小
装们拉开差距,显得层次高,自会有人贴过来膜拜他们,叫他们大神。
姜文拍电影,也图个被认同。他的四部风格各异的电影,都有强烈的自我
表达欲望。每一个片中的“我”,包括夏雨演的,都是他内心的部分投射。其前三部电
影表现出来的选本、选角的眼光,节奏、镜头的把握,讲故事谈思想的水平等硬实力,
在吾等小青年心中已然封神入圣。但姜文不满足,他追求更广阔的认同。《鬼来》被禁
,《太阳》票房不佳,这些不认同的声音在姜文心里絮絮叨叨挥之不去。
两年多后,姜文射出来的,是经过精心构化,寻求破局的子弹。他的野心是得到同
行,大众,小青年,大神和官府共同的认同。一言以蔽之:
我姜文,“站着”也能把钱赚了。
我从没见过国产导演有如此之大的野心,这野心听起来又如此的不可实现
。同行是冤家,小青年想脱离大众,大神要高于小青年。 最重要的是,官府认同的,
小青年和大神就不认同。大众同行还算容易同时取悦。但小青年,大神和官府这三群,
在态度上冰炭不容。
现实正是如此,在官府放行,喉舌大赞之后,电影自身素质迅速赢得了同
行和大众的青睐。 广大小装青年们在短暂的观望后,看到宁财神同学的一句“姜文王
朝来了!”后立即拜倒投诚。罗永浩,今何在等大神迫不及待地跟跳出来,“日,评价
这么高,不至于吧。(这电影没啥思想啊)”,“下次拍个更有追求的电影”,“你们
到底为什么激动啊”。 更极端一些的人开始咒骂,“姜文背叛了我们背叛了理想,腐
化了拜金了追求票房了”。“站着,也能挣钱”这种事在他们眼里是没门的。 “你媚
俗了大众,让大家都看的懂,你就已经跪下了。”“你媚俗了官府,不玩政治讽刺了,
你就已经跪下了!”。
连我这个不合群的小装青年,看完后也充满了疑惑。前两小时被导演带着
高速狂飙,爽透了,结尾的节奏变化却让我无所适从。张麻子打倒了黄四郎, 最后却
一无所得,兄弟女人也离他远去。他骑着白马缓缓离去的场景让我十分落寞。虽然最后
的那场“起义”倾向危险…但这就是姜文电影里想说的么?
子弹呼啸而来,透体而过,我却没一点感觉,好像没打中一样。搞的我连影评都不
想写了。
姜文说:“让子弹飞一会儿”。
电影的开头,张麻子对着白马开了一枪,这枪瞄准绳结,打中却不打断。
白马继续跑,绳索已不能吃力。让“子弹飞了一会”,绳索终于断裂,白马才四散跑开
。电影的结尾,姜文对我开了一枪。 白马在我脑中奔驰一夜一天,绳索终于断裂, 我
才舒服了。
如果你看见了那思绪拖出来的暗线,就会明白宁财神说错了。“姜文的王朝,永远
不会到来”
影评这么多,吐槽点最多的就是周润发饰演的黄四郎了。这个地主恶霸,说单词,
玩“介错”,还总要拽拽文,钱也多的离谱。这些特质可笑,不必要,也不合理。 但
揭开暗线的线索,就在于这些“不合理”。 影片的暗线,几乎都巧妙得埋在笑料之下。
问题1:故事发生在什么时间? 1920.
葛优演的马县长,在刚进鹅城不久就说:“不好,我们来晚了,前任县长已经把税
预征到90年后了,都到2010年了”。 原著中故事发生在193X年,是姜文特意改到1920
年的。
问题2:黄四郎只是个地主恶霸么? 没那么简单
黄四郎交给假麻子(胡军)地雷时,说了很多:“北中国我不知道,但这种限量版
地雷,整个南国只有两个”;“第一个在辛亥革命时炸了第一响”;“惊天,动地,还
泣鬼神”;“1910,made in U.S”
辛亥革命发生于1911年,这1910年才生产。 黄四郎不但知道辛亥革命的地雷是什
么型号,还拥有唯一一颗双胞胎地雷。 请问,黄四郎在辛亥革命中,发挥了什么作用?
黄四郎参与了在武昌起义的核心策划,是辛亥革命的老资格革命党!不信?下面还
有佐证
问题3:张麻子只是个土匪么? 当然不是
电影里很明白的说了, 张牧之,早年追随松坡将军(蔡锷),17岁时即为其麾下
手枪队长。是讲武堂出来的(考虑到蔡锷,应为1909年成立的云南陆军讲武堂)。蔡锷
在日本死后(1916),张牧之回国,落草。
蔡锷何人?梁启超高徒,民国开国元勋,护国军神。 1911年辛亥武昌起义后20日
,蔡锷就在云南发动重九起义响应革命。1915年又发动护国讨袁并取得胜利。张牧之早
年即追随他,也算是 辛亥革命党对老资格。
张牧之和黄四郎还曾是革命战友? 影片给出了明显的线索
问题4:1900的一面之缘?
张牧之与马邦德赴黄四郎的鸿门宴时, 黄四郎说。“20年前,我和张麻子曾有一
面之缘”。从影片可以看出,黄四郎一开始就知道假县长就是张牧之就是张麻子。这句
一面之缘,是他刻意点开的敲山震虎。影片确凿的发生在1920年。 20年前就是1900年。
黄四郎和张牧之在这一年见过面? 那一年发生了什么? 我们继续从张17岁当上蔡
锷手枪队长入手。
问题是,张牧之现在多少岁,又是那一年遇上蔡锷的呢?
蔡锷1882年12月出生,1899年在时务学堂的老师唐才常德资助下赴日本留学,1904
年毕业于日本陆军士官学校毕业。 回国后先后在湖南广西云南等地练兵。
如果张是1904年后见到的蔡锷,那么1900年时张牧之不超过13岁。 这样的孩子不
应引起黄四郎的注意。且1920年时33岁,似乎又嫩了一些。蔡锷活到此时也不过三十七
岁。 1899年之前的蔡锷不过是个16岁不到的学生,虽然已经声名不弱,但也不至于配
个手枪队长吧。 张蔡相逢,应为1899-1904年蔡锷留学时发生。17岁的张牧之,又为何
会给一个留学生作手枪队长呢?
查了一下,1900年时,唐才常策划在武汉发动“自立军起义”。 蔡锷闻讯即回国
响应老师。但唐看他年纪小,就派他去湖南送信。 后来唐才常被张之洞拍平, 蔡锷身
在湖南躲过此劫,又回了日本(其实这时候他才改名叫蔡锷,才去学军事)。我以为,
张牧之当上蔡锷手枪队长,正是这一年。 估计是唐才常不放心蔡锷一个人走,派了张
牧之这个同龄毛头小伙子,给他当的保镖--”手枪队长”(估计是光头小队长)。 这
样算,1920年影片发生时张牧之37岁,也很符合人物形象。
黄四郎会在1900年认识张牧之,两种可能。1是黄也参与了自立军起义,在武汉或
者湖南见过蔡锷与张牧之。 2是蔡锷把这个手枪小战士一起带到了日本,然后在日本和
黄有过一面之缘。
我更倾向于后者, 因为黄四郎和张牧之,显然都在日本混过不短地时间。
问题5:张牧之黄四郎都混过日本? 应该是,他们都对介错很熟
先来介绍一下介错:
日本人不爱上吊爱切腹,他们觉得切死自己挺光荣的。 但切腹挺难操作,一刀捅
进去,一时死不了还特别疼。身体倒得七扭八歪,挣扎起来满地的血,死相难看,特别
不体面。故很多时候切腹者会让一个信赖的朋友当「介错」。介错人手持长刀站在其身
后,在自杀者的短刀切腹的一瞬间砍下他的脑袋。
切腹大家都熟,但介错就相对冷僻。 更别说在没网络和电视的1920年, 如果不是
对日本文化相当熟悉的人,根本说不出这俩字吧。
黄四郎在鸿门宴上说“要是这三个人供出我来,我就切腹,请兄台当我的介错”。
张牧之说“你搞错了,介错人用的是长刀”。两个人应该都在日本待过相当长的时间
。 尤其是黄四郎,好端端的中国人没事谁能扯到切腹去。张牧之要在日本混,只能是
1900-1904年。因为1904年蔡锷回国后就没怎么去日本(其实我也不熟,蒙的),作为
蔡锷的手枪队长,张牧之也不能去日本。等1916年8月,蔡锷病重去日本治病,当时张
牧之一定跟着去了日本,但估计这段时间他可没兴趣研究什么切腹。何况11月初蔡锷就
病逝了。

回答了这5个问题后, 我们重新看黄四郎这个人。 他留过西洋,也留过东洋。说
话爱拽文,冒成语,国学功底算不错。你若把他看作一个土财主,这些设定显然有很蹩
脚; 但若把他看作早期便追随孙中山的革命党, 那些设定就很恰当。
黄四郎,不仅仅是一个简单的土财主。 他是一个腐化的前革命者,现当权派。 在
鹅城,他是“官府”的代言人。
我总结一下暗线:
1900年,张牧之追随蔡锷到日本,并与黄四郎有一面之缘。
1900-1911年,张牧之和黄四郎在同一个革命阵营,但无交集。
1911年10月10日, 辛亥武昌起义,黄四郎为核心成员。 10月30日,蔡锷在云南发
动重九起义,张牧之也算核心成员。
1911年-1920年. 辛亥胜利后,革命者黄四郎,开始利用手中的权利敛财。他投靠
了实力军阀张敬尧(还是张宗昌? 其实我没听清楚。 总不能是张孝准吧)这座靠山后
,愈发肆无忌惮,横征暴敛,更以故乡鹅城为根本苦心经营,控制了民国小半的烟土交
易,大发其财。
辛亥胜利后,革命者张牧之,不求权钱,继续追随蔡锷。 1916年蔡锷死
于日本,此后张牧之对时局失望,干脆落草为寇。
1920年, 张牧之马邦德来到鹅城,电影开始。张黄斗法,掀起了一个小小的鹅城
起义,胜利后张牧之分文不得,心爱的女人和他的兄弟们一起走了。这场“革命”,正
如当年的辛亥革命, 他什么也没得到,甚至失去了很多。 他坐的chair, 也被别的
man抗走了。
这就是姜文在此电影里内藏的政治隐喻。 谁会投入革命?蔡锷这样的英雄会,袁
世凯这样的枭雄会,但最后得权的一定是袁世凯;张牧之这样的爷们会,黄四郎这样的
投机者会,但最后得利的一定是黄四郎。 当张牧之再次掀起鹅城革命,他不为财也不
为权,不为女人也不为大众。他对黄四郎说:“没有你,对我很重要”。
如果你们觉得这个隐喻还不够过瘾, 鸿门宴上还有句台词。“彼时彼刻?” “恰
如此时此刻”(谢绝联想,请勿跨省)。
问题6:姜文要干什么? “让子弹飞一会”
解决了前5个问题,我们就明白姜文如何同时取悦小装,大神和官府三个群体了。
那就是打时间差。这是一部让子弹飞一会儿才能被解读出的电影,子弹中的火药藏在喜
剧和商业的外壳之下,躲过了官府的剪刀手。 他若明白无误的指出黄四郎是由XX手段
走上统治阶级的恶棍,配合最后的“鹅城运动”,那这片死的绝对比宁浩的《无人区》
还惨烈。等子弹飞完,官府醒过神儿来,影片都下映了。
从技术手段来说,姜文为追求这个飞一会儿才明白的效果,刻意的将每一条重要的
线索后埋一个包袱以转移注意力。 比如张牧之刚刚自陈身份,说自己跟松坡将军混过
。 观众还没转过筋想清楚松坡是谁,葛优就跳出来插科打诨:“那一年,我十七岁,
她也十七岁...”。在逗笑大家之余,将观众的注意力从“松坡”,“十七岁” 这样的
线索上转移开。避免影片立刻被看懂。
姜文的电影爱悄悄的牵扯些政治,但要把子弹对着官府打,未免自讨死路。他准备
打向谁? 这就是本文最后要讨论的问题,也是姜文更大的野心所在。 看官们可以把他
野心想的特别不怕死,但我可不敢胡写。我觉得他把枪口对准时下电影界,对准某位电
影界的官府代言人。
让我们再回顾一下姜文那句“我姜文站着,也能把钱挣了”。这点野心,观众都看
的出来,也不难理解这句有点揶揄闷头挣钱的冯小刚。冯导岂是在于这点揶揄的人?还
主动客串了汤师爷,和葛优联袂出演赚钱众。(冯导不但拍片赚钱发挥稳定,客串也是
稳定的头五分钟就死。)汤师爷落水而死, 葛优演的马邦德为求活命,一直在冒充汤
师爷。 可以说,在电影里,葛优代表了冯小刚。马邦德说的,就是汤师爷说的。也是
冯小刚说的。
汤师爷要赚钱,他向谁跪? 官府代言人“黄四爷”。 他怎么着挣钱? 黄四爷带
头出钱,其他人就得跟着出钱,回头把钱还给黄四爷,得利三七开。
张牧之要站着挣钱,也得在汤师爷的配合下,先忽悠“黄四爷”先出了一百八十万
两银子才行。
关键问题来了,汤师爷想赚钱得跪官府代言人黄四爷,冯导演想赚钱得跪那位爷?
时下电影圈里, 有没有一个“爷”,是公认的官府代言人呢。这位爷,如果像黄
四爷一样恶劣,已成中国电影的毒瘤,就够好了。这位爷,如果像黄四爷一样发家,先
投身于“导”,一步步的向官府靠拢,终究成“爷”,就再好不过了。
有没有这样的一位爷,让姜文这种爷们电影人觉得。“X爷,没有你,对我很重要
”。线索还在电影里
理解子弹的政治隐喻,突破点在于姜文相对于原著,对故事发生时间的改动。
理解子弹的现实所指,突破点在于姜文相对于原著,对角色姓名的改动。
在原著里,黄财主的原名叫黄天榜,”黄天棒”. 在电影里,叫作黄四郎,“黄四
爷”。
韩三爷,您得多么的无畏,才敢于把自己的名字,放在这片儿的出品人上? 您给
这电影投了多少钱来着, 别是一千八百万
(原著师爷姓陈,没县长这人。 电影里分别安上汤,马二名。将将是个“冯”字
,有点附会,放括号里图个好玩吧)
在电影后半, 张麻子对着黄四爷派出来的马车,虚射一枪,“让子弹飞一会”。
片刻,枪声四起。
《让子弹飞》上映一会后,终会成燎原之势。其它手里有枪的导演,编剧,演员,
杂志,评论家们,都会迫不及待的把肚子里藏了多年的子弹打出去。
姜文必将瓦解一个“三爷的王朝”,“剪刀手的王朝”。让黑马们倒下,白马们得
以挣脱沉重的束缚。但”姜文的王朝”,永远不会来临。他会从容的从椅子上站起来,
让别人搬走。自己骑上白马,悠然的离开我们的视线,化为一个传说。
让子弹飞一会儿吧!
avatar
V*x
3
挺喜欢这歌。。。
加上一首摇篮曲憋半天也憋不出来。。
还是吼吼吧。。。>中间掺杂了一点厨房剁肉的声音。。
室友阿姨给孩子做饭ing。。
当我走在这里的每一条街道
我的心似乎从来都不能平静
除了发动机的轰鸣和电气之音
我似乎听到了他烛骨般的心跳
我在这里欢笑
我在这里哭泣
我在这里活着
也在这里死去
我在这里祈祷
我在这里迷惘
我在这里寻找
在这里失去
北京 北京
咖啡馆与广场有三个街区
就像霓虹灯到月亮的距离
人们在挣扎中互相告慰和拥抱
寻找着追逐着奄奄一息的碎梦
我们这里欢笑
我们这里哭泣
我们这里活着
也这里死去
我们这里祈祷
我们这里迷惘
我们这里寻找
也在这失去
北京 北京
如果有一天我不得不离去
我希望人们把我埋在这里
在这儿我能感觉到我的存在
在这有太多让我眷恋的东西
我在这里欢笑
我在这里哭泣
我在这里活着
也这里死去
我在这里祈祷
我在这里迷惘
我在这里寻找
也在这失去
北京 北京
avatar
k*3
4
Kindle 3G刷了多看之后还能用吗?
avatar
p*2
5
就是学习Haskell太疯狂了,让人常常质疑为啥不直接上Haskell算了。
avatar
c*2
6
Depending on the reason of the I-539 denial. If USCIS denies it because they
think you were not keeping a valid non-immigrant status, then you have to
leave US and return with a visa.
Otherwise if your current non-immigrant status is still valid(I-539 denial
reason unrelated to your status), you can file another COS that is valid
within US.
avatar
l*y
7
嗯哪,烹调金属音乐
抢了版四的沙发~~
唱得很深情动人!

【在 V***x 的大作中提到】
: 挺喜欢这歌。。。
: 加上一首摇篮曲憋半天也憋不出来。。
: 还是吼吼吧。。。>: 中间掺杂了一点厨房剁肉的声音。。
: 室友阿姨给孩子做饭ing。。
: 当我走在这里的每一条街道
: 我的心似乎从来都不能平静
: 除了发动机的轰鸣和电气之音
: 我似乎听到了他烛骨般的心跳
: 我在这里欢笑

avatar
d*e
8
什么叫”能用“?

【在 k**3 的大作中提到】
: Kindle 3G刷了多看之后还能用吗?
avatar
d*e
9
haskell的默认string 实现太慢了。比python慢10倍。

【在 p*****2 的大作中提到】
: 就是学习Haskell太疯狂了,让人常常质疑为啥不直接上Haskell算了。
avatar
b*g
10
可以去第三国签了 再入境吗?
还是必须回中国签过来?
谢谢
avatar
c*n
11
bd~~~好听
四当家的有木试过Adele的歌?声线很像,很Jazz
avatar
k*g
12
多看不支持网络,为了省电,刷以前记得关闭无线

【在 k**3 的大作中提到】
: Kindle 3G刷了多看之后还能用吗?
avatar
l*s
13
It is trivial to use the non-lazy alternative.


【在 d******e 的大作中提到】
: haskell的默认string 实现太慢了。比python慢10倍。
avatar
a*7
14
好听!
这歌我前一阵刚刚喜欢上,还没学会。。。

【在 V***x 的大作中提到】
: 挺喜欢这歌。。。
: 加上一首摇篮曲憋半天也憋不出来。。
: 还是吼吼吧。。。>: 中间掺杂了一点厨房剁肉的声音。。
: 室友阿姨给孩子做饭ing。。
: 当我走在这里的每一条街道
: 我的心似乎从来都不能平静
: 除了发动机的轰鸣和电气之音
: 我似乎听到了他烛骨般的心跳
: 我在这里欢笑

avatar
k*3
15
谢谢

【在 k***g 的大作中提到】
: 多看不支持网络,为了省电,刷以前记得关闭无线
avatar
d*e
16
还有就是tree的实现比较弱吧。
做简单的东西和web service,haskell的确比较爽。

【在 l*********s 的大作中提到】
: It is trivial to use the non-lazy alternative.
:

avatar
z*o
17
V5,很有jazz的味道

【在 V***x 的大作中提到】
: 挺喜欢这歌。。。
: 加上一首摇篮曲憋半天也憋不出来。。
: 还是吼吼吧。。。>: 中间掺杂了一点厨房剁肉的声音。。
: 室友阿姨给孩子做饭ing。。
: 当我走在这里的每一条街道
: 我的心似乎从来都不能平静
: 除了发动机的轰鸣和电气之音
: 我似乎听到了他烛骨般的心跳
: 我在这里欢笑

avatar
k*3
18
我听说多看是dual-boot,想上网看邮件的时候可不可以用kindle带的browser?

【在 d*******e 的大作中提到】
: 什么叫”能用“?
avatar
w*g
19
因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
不断提醒自己我在用的是hack版,是有罪的.
我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
任”的态度。IO monad其实也是这个意思。
所谓纯FP的意思就是说我不是在做I/O,而是在对一堆I/O操作进行计算。其实
FP只是一种世界观而已,以haskell的眼光看过去, 从C++里面绝对能看到
一个一个的monad。
我早觉得haskell是一种很迂腐的语言。

【在 d******e 的大作中提到】
: haskell的默认string 实现太慢了。比python慢10倍。
avatar
s*3
20
赞刚柔并济!!! 好听的呢~~~ 神马叫做唱作俱佳啊有木有!!!
就是冇听到传说中的厨房剁肉声, 有点点小遗憾...

【在 V***x 的大作中提到】
: 挺喜欢这歌。。。
: 加上一首摇篮曲憋半天也憋不出来。。
: 还是吼吼吧。。。>: 中间掺杂了一点厨房剁肉的声音。。
: 室友阿姨给孩子做饭ing。。
: 当我走在这里的每一条街道
: 我的心似乎从来都不能平静
: 除了发动机的轰鸣和电气之音
: 我似乎听到了他烛骨般的心跳
: 我在这里欢笑

avatar
e*y
21
这是老黄历了

【在 k***g 的大作中提到】
: 多看不支持网络,为了省电,刷以前记得关闭无线
avatar
p*r
22
我去,虽然我没学习过,不过还是给跪了。

【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责

avatar
n*g
23
顶汪峰!
四爷唱出了跟汪峰很不一样的感觉!

【在 V***x 的大作中提到】
: 挺喜欢这歌。。。
: 加上一首摇篮曲憋半天也憋不出来。。
: 还是吼吼吧。。。>: 中间掺杂了一点厨房剁肉的声音。。
: 室友阿姨给孩子做饭ing。。
: 当我走在这里的每一条街道
: 我的心似乎从来都不能平静
: 除了发动机的轰鸣和电气之音
: 我似乎听到了他烛骨般的心跳
: 我在这里欢笑

avatar
e*y
24
切换回原系统, 大概要花1 min

【在 k**3 的大作中提到】
: 我听说多看是dual-boot,想上网看邮件的时候可不可以用kindle带的browser?
avatar
d*i
25
哈哈,不错的见解。所以现实主义,实用主义是永恒的真理,“PHP是最好的语言”不
是玩笑话。

【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责

avatar
V*x
26
谢谢楼上所有童鞋~~汪峰的这首歌反正吧,被我糟禁了~:P
to lily:呵呵,下次再整个锅碗瓢盆各种交织?:)
to cadgn:cadenza同学管你叫卡登,我都快混乱ing。。。
管你叫cad吧。。以示区别。。Adele,难度颇高,无法驾驭。。
只能仰视而已。。另:四当家,脑海中第一个浮现的是。。。
络腮粗犷一身匪气杀富济贫外加掳获别家女儿当压寨夫人
的胡子一枚啊。。。>to airdragon77:琪琪速速搅拌~~哈哈
to zhangdao:Jazz。。其实内个。。这歌好像不走爵士风的。。
误导你们了~>to supercat123:过奖了。。唱是没唱明白,作更是不会。。。
摇篮曲是和一个偶像合作的歌儿,肿是唱不出感觉来。。。
to niupitang:嘿嘿。。汪峰的歌还是男生唱才能唱出那种撕心裂肺的痛苦~
avatar
k*3
27
能换回去就行。想入个Kindle 3 3G版,但是不想丢掉免费的3G。
avatar
c*9
28
IO monad 龌龊?我觉得总的来说monad是优雅的方式。
”现实“也不是不可变的,“现实”要接近理想才是进步。

【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责

avatar
a*u
29
Re"就是冇听到传说中的厨房剁肉声, 有点点小遗憾..."
自从上次看到剁肉这个词就想起张曼玉以后,
对剁肉声很有兴趣。
昨天就听了,
没有听出来,遗憾!
今天仔细从头再听,还是木有,遗憾!
剁肉声啊!
隐藏滴很深啊!
甚至比我滴锅碗瓢盆声
还要轻~~~啊!
墙裂建议丢掉这支麦,上大振膜!
我上次锅碗瓢盆就是大振膜NT1—A收录滴!
期待早日听到剁肉声!

【在 s*********3 的大作中提到】
: 赞刚柔并济!!! 好听的呢~~~ 神马叫做唱作俱佳啊有木有!!!
: 就是冇听到传说中的厨房剁肉声, 有点点小遗憾...

avatar
a*a
30
不是,就连最新的1211版本,依然有人反映battery drain
其实最省电最稳定的版本是之前7月的一个

【在 e***y 的大作中提到】
: 这是老黄历了
avatar
S*A
31
非常赞同!迂腐非常贴切。
我另外一个观察就是,人们比较容易理解符合
execution flow 的代码。汇编不好读其中一个原因
就是跳来跳去人脑为了理解程序需要记住很多中间
状态。人脑是比较擅长理解过程式的状态,先做个,
下一部做那个,然后这个就变成了那个。
所以结构化的 if else,用空格 indent 来标明程序
机构,就是让程序的代码的阅读结构更加接近
execution flow。帮助人们理解,这一块是干什么的。
人脑不擅长高度抽象的推演和。有些描述很通用很
抽象,例如 meta class 这种,很多人理解就很费力。
人们通常需要看到这个抽象的东西如何实例话才能
理解。
Haskell 的整个就是代码非常不符合 execution flow。
这个给理解和调试都带来困难。Lisp 这类的语言出现
比 C 什么的早很多,甚至有硬件直接支持 Lisp 的。
但是一直推广比不上 C 这样的语言。这是其中一个
原因,这类 FP 比过程式语言难写难维护。

【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责

avatar
V*x
32
大振膜。。你得让我的声卡和电脑配合起来才行啊。。
现在用新麦录歌。。。被声卡导致的耳机的伴奏各种延迟啊。。
不是停顿就是慢慢延迟。。结果录出来的声音和伴奏,
用一个词:渐行渐远。。。
所以,新麦还得雪藏一阵子,哈哈~~

【在 a*******u 的大作中提到】
: Re"就是冇听到传说中的厨房剁肉声, 有点点小遗憾..."
: 自从上次看到剁肉这个词就想起张曼玉以后,
: 对剁肉声很有兴趣。
: 昨天就听了,
: 没有听出来,遗憾!
: 今天仔细从头再听,还是木有,遗憾!
: 剁肉声啊!
: 隐藏滴很深啊!
: 甚至比我滴锅碗瓢盆声
: 还要轻~~~啊!

avatar
l*e
33
可以切换回原系统
avatar
c*9
34
你不如说人脑更适合控制吃喝拉撒。

【在 S*A 的大作中提到】
: 非常赞同!迂腐非常贴切。
: 我另外一个观察就是,人们比较容易理解符合
: execution flow 的代码。汇编不好读其中一个原因
: 就是跳来跳去人脑为了理解程序需要记住很多中间
: 状态。人脑是比较擅长理解过程式的状态,先做个,
: 下一部做那个,然后这个就变成了那个。
: 所以结构化的 if else,用空格 indent 来标明程序
: 机构,就是让程序的代码的阅读结构更加接近
: execution flow。帮助人们理解,这一块是干什么的。
: 人脑不擅长高度抽象的推演和。有些描述很通用很

avatar
w*w
35
呵呵,梦想与现实总有一步之遥
avatar
S*A
36
这个的确是对的啊,每个人都会吃喝拉撒,没有什么困难吧。
但是不是每个人都适合编程。适合做程序员是人口里面的
一小部分。

【在 c*******9 的大作中提到】
: 你不如说人脑更适合控制吃喝拉撒。
avatar
w*w
37
先来熟悉一下声音
avatar
d*r
38
Mark 了

【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责

avatar
j*t
39
酷酷又开始录歌了,撒花!~~~
怎么这么干?

【在 V***x 的大作中提到】
: 挺喜欢这歌。。。
: 加上一首摇篮曲憋半天也憋不出来。。
: 还是吼吼吧。。。>: 中间掺杂了一点厨房剁肉的声音。。
: 室友阿姨给孩子做饭ing。。
: 当我走在这里的每一条街道
: 我的心似乎从来都不能平静
: 除了发动机的轰鸣和电气之音
: 我似乎听到了他烛骨般的心跳
: 我在这里欢笑

avatar
l*s
40
That is why haskell most often helps you to become a better programmer ...
in another language. It makes you sharp : -)

【在 S*A 的大作中提到】
: 非常赞同!迂腐非常贴切。
: 我另外一个观察就是,人们比较容易理解符合
: execution flow 的代码。汇编不好读其中一个原因
: 就是跳来跳去人脑为了理解程序需要记住很多中间
: 状态。人脑是比较擅长理解过程式的状态,先做个,
: 下一部做那个,然后这个就变成了那个。
: 所以结构化的 if else,用空格 indent 来标明程序
: 机构,就是让程序的代码的阅读结构更加接近
: execution flow。帮助人们理解,这一块是干什么的。
: 人脑不擅长高度抽象的推演和。有些描述很通用很

avatar
w*w
41

呵呵,俺翻的老账~~

【在 j*****t 的大作中提到】
: 酷酷又开始录歌了,撒花!~~~
: 怎么这么干?

avatar
p*2
42
确实 收获很大

【在 l*********s 的大作中提到】
: That is why haskell most often helps you to become a better programmer ...
: in another language. It makes you sharp : -)

avatar
l*n
43
I received such an email today from twitter:
We are seeking to bring on a number of Scala engineers to join Twitter's
backend Web team to help us build, scale and refine high-performance
scalable systems.
avatar
n*w
44
早期的lisp基本上都是解释的?比较慢性能不及c,尤其当时机器还慢得很。不知道为
什么lisp机没能成功。好像Java机也有人搞过?
还有人把lisp没能流行归结为没有标准的类库。

【在 S*A 的大作中提到】
: 非常赞同!迂腐非常贴切。
: 我另外一个观察就是,人们比较容易理解符合
: execution flow 的代码。汇编不好读其中一个原因
: 就是跳来跳去人脑为了理解程序需要记住很多中间
: 状态。人脑是比较擅长理解过程式的状态,先做个,
: 下一部做那个,然后这个就变成了那个。
: 所以结构化的 if else,用空格 indent 来标明程序
: 机构,就是让程序的代码的阅读结构更加接近
: execution flow。帮助人们理解,这一块是干什么的。
: 人脑不擅长高度抽象的推演和。有些描述很通用很

avatar
l*t
45

这很逗比啊。你写个unit test就知道为什么IO应该都滚出去了

【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责

avatar
d*r
46
大牛展开说说?
这个不是 FP 的主要卖点吗

【在 l******t 的大作中提到】
:
: 这很逗比啊。你写个unit test就知道为什么IO应该都滚出去了

avatar
S*A
47
这个是两回事。你可以说用汇编让你成为
更好程序员,因为没有好的功力写不了
上规模的汇编。
语言只是工具而已。

【在 l*********s 的大作中提到】
: That is why haskell most often helps you to become a better programmer ...
: in another language. It makes you sharp : -)

avatar
S*A
48
lisp 和 haskell 一样,要写出高效率的
代码需要很高的功力,那种高效的做法
往往是不直观简单的。实际的机器不是
那么clean,现在lisp就算编译还是不如c。
因为距离机器码比较远。

【在 n*w 的大作中提到】
: 早期的lisp基本上都是解释的?比较慢性能不及c,尤其当时机器还慢得很。不知道为
: 什么lisp机没能成功。好像Java机也有人搞过?
: 还有人把lisp没能流行归结为没有标准的类库。

avatar
l*t
49
当然是啊。我是说他的说法逗B

【在 d*******r 的大作中提到】
: 大牛展开说说?
: 这个不是 FP 的主要卖点吗

avatar
g*w
50

Well, some lisp implementations work very well now, such as sbcl, abcl, etc.

【在 S*A 的大作中提到】
: lisp 和 haskell 一样,要写出高效率的
: 代码需要很高的功力,那种高效的做法
: 往往是不直观简单的。实际的机器不是
: 那么clean,现在lisp就算编译还是不如c。
: 因为距离机器码比较远。

avatar
S*A
51
我不相信 Lisp 编译出来的代码可以接近 C 生成的代码的运行效率。
你要是觉得可以,我给你个短 C 程序实验一下。是个有点实际运算
量的东西。

etc.

【在 g******w 的大作中提到】
:
: Well, some lisp implementations work very well now, such as sbcl, abcl, etc.

avatar
d*i
52
C跟机器码指令集有着一一对应的关系,所以效率最高速度最快, 而lisp完全不同,想
用FP这种上层的逻辑来talk to底层的硬件,做梦。

【在 S*A 的大作中提到】
: 我不相信 Lisp 编译出来的代码可以接近 C 生成的代码的运行效率。
: 你要是觉得可以,我给你个短 C 程序实验一下。是个有点实际运算
: 量的东西。
:
: etc.

avatar
S*A
53
没有到一一对应的地步。有很多机器码是没有 C 对应的东西的。
C 的变量需要分配到寄存器,有时候会 spill。
但是 C 很容易翻译到机器码是真的。C 可以当高级汇编用。
不需要 Lisp talk to 硬件,只是说实现一般的运算逻辑不可能
和 C 的运行效率高。假设都是非常好的程序员写的。

【在 d****i 的大作中提到】
: C跟机器码指令集有着一一对应的关系,所以效率最高速度最快, 而lisp完全不同,想
: 用FP这种上层的逻辑来talk to底层的硬件,做梦。

avatar
p*2
54
为什么偏要跟c比?

【在 S*A 的大作中提到】
: 没有到一一对应的地步。有很多机器码是没有 C 对应的东西的。
: C 的变量需要分配到寄存器,有时候会 spill。
: 但是 C 很容易翻译到机器码是真的。C 可以当高级汇编用。
: 不需要 Lisp talk to 硬件,只是说实现一般的运算逻辑不可能
: 和 C 的运行效率高。假设都是非常好的程序员写的。

avatar
n*3
55
clojure 啊
performance 狠不错啦

【在 S*A 的大作中提到】
: 我不相信 Lisp 编译出来的代码可以接近 C 生成的代码的运行效率。
: 你要是觉得可以,我给你个短 C 程序实验一下。是个有点实际运算
: 量的东西。
:
: etc.

avatar
l*s
56
They both produce native codes, I can't see why lisp must be much slower
than C.
However, the more high level is a language, the more difficult to turn its
performance, simply because there are so many stuffs hidden from you.

【在 S*A 的大作中提到】
: 没有到一一对应的地步。有很多机器码是没有 C 对应的东西的。
: C 的变量需要分配到寄存器,有时候会 spill。
: 但是 C 很容易翻译到机器码是真的。C 可以当高级汇编用。
: 不需要 Lisp talk to 硬件,只是说实现一般的运算逻辑不可能
: 和 C 的运行效率高。假设都是非常好的程序员写的。

avatar
g*w
57

lisp接近C还做不到,但确实performance已经不错了,譬如sbcl,benchmark game 可
以参考。考虑到一直只是那么几个人开发维护,it's amazing! And actually lisp (
sbcl) may be the fastest dynamic language.

【在 S*A 的大作中提到】
: 我不相信 Lisp 编译出来的代码可以接近 C 生成的代码的运行效率。
: 你要是觉得可以,我给你个短 C 程序实验一下。是个有点实际运算
: 量的东西。
:
: etc.

avatar
S*A
58
你要试一下吗?
http://www.mitbbs.com/article_t1/Programming/31381809_0_4.html
测试数据生成在 80 楼, 完整 C 程序在 83 楼。
这个算法理论背景在这里,我用的算法就是dynamic 那个,
还不是空间最优的解法。空间用了 nxm:
http://www.ics.uci.edu/~eppstein/161/960229.html
欢迎用 Closure 和 Scala 或者 Lisp 来做同样的东西我们来看看
实现的代码运行速度怎样。
有代码可以比较大家就有感觉这个非常接近 C 的 performance 到底
是接近到什么程度。

【在 l*********s 的大作中提到】
: They both produce native codes, I can't see why lisp must be much slower
: than C.
: However, the more high level is a language, the more difficult to turn its
: performance, simply because there are so many stuffs hidden from you.

avatar
z*g
59
说的真好,越往下越是一坨

【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责

avatar
a*e
60
你混淆了好几个概念,貌似有道理,其实错得很远。
Haskell 语言本身纯,和它依赖库来提供高效实现,没有任何冲突。像 int, string
这种,本来就是不需要放到语言设计里东西。用 ByteString 或者 Text 不会有任何
hack 的感觉,和使用其它的 library 一样使用,我不知道你这种说法有什么依据,哪
些地方 hack 了?用第三方库能用出有罪的感觉,我真是无言以对...
Haskell 用 Monad 来给副作用之间画出界限,比起 imperative 语言里面随便把副作
用堆在一起,是一种进步。你可以说你不 care,但是需要 care 的时候,Haskell 可
以帮你清楚的分开副作用和无副作用,imperative 语言做不到。
的确,IO Monad 被不少搞理论的人诟病,说是 hack,但是你首先要弄清楚 IO Monad
只是众多 Monad 中的一种,Haskell 里面处理 IO 可以用 IO Monad,也可以用别的方
式,并没有强迫你使用 IO Monad,说到底,用 IO Monad 都是库,不是语言本身,用
不用可以由用户自己选择。与此相关的研究一直在向前发展,并没有被 IO Monad 束缚
住。
你所谓的“这不是我的责任”,我也不知道这句话是从何说起。如果要说一个 Haskell
程序员和一个 Python 程序员有什么责任方面的差别,如果最终目的都是要尽可能确
保程序的 type safety, effect safety, thread safety 种种特征,显然 Haskell 程
序员可以从语言本身得到各种帮助,而不是像 Python 程序员那样唯一的依仗只有测试。

【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责

avatar
w*g
61
请科普下Haskell中不用IO monad的IO方式,在GHC中能用即可。
别的都是个人taste问题,没法argue。

Monad

【在 a*****e 的大作中提到】
: 你混淆了好几个概念,貌似有道理,其实错得很远。
: Haskell 语言本身纯,和它依赖库来提供高效实现,没有任何冲突。像 int, string
: 这种,本来就是不需要放到语言设计里东西。用 ByteString 或者 Text 不会有任何
: hack 的感觉,和使用其它的 library 一样使用,我不知道你这种说法有什么依据,哪
: 些地方 hack 了?用第三方库能用出有罪的感觉,我真是无言以对...
: Haskell 用 Monad 来给副作用之间画出界限,比起 imperative 语言里面随便把副作
: 用堆在一起,是一种进步。你可以说你不 care,但是需要 care 的时候,Haskell 可
: 以帮你清楚的分开副作用和无副作用,imperative 语言做不到。
: 的确,IO Monad 被不少搞理论的人诟病,说是 hack,但是你首先要弄清楚 IO Monad
: 只是众多 Monad 中的一种,Haskell 里面处理 IO 可以用 IO Monad,也可以用别的方

avatar
a*e
62
如果你是说底层,其实 IO Monad 就是 ST Monad 封装了诸多 FFI 而已,不想用 IO
Monad,可以直接调用 FFI.
如果你是说别的抽象方式,可以看看 effect handler
http://okmij.org/ftp/Haskell/extensible/
domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
http://haskell.cs.yale.edu/?post_type=publication&p=802

【在 w***g 的大作中提到】
: 请科普下Haskell中不用IO monad的IO方式,在GHC中能用即可。
: 别的都是个人taste问题,没法argue。
:
: Monad

avatar
a*e
63
回顾 Haskell 发展历史,IO Monad 还是后来出现的。起初是用的 CPS (continuation
passing style) 的方式来做的,后来 CPS Monad 被发现后,就都使用 Monad 来做了
。使用 ST Monad 封装则更靠后一些,是 SPJ 搞的,因为实在是太方便了,各种
effect 直接都封在 IO Monad 里面像 imperative 语言一样都堆在一起就好了,这种
choose the easy way out 的做法导致它被人(主要是 theoretician)诟病至今。

IO

【在 a*****e 的大作中提到】
: 如果你是说底层,其实 IO Monad 就是 ST Monad 封装了诸多 FFI 而已,不想用 IO
: Monad,可以直接调用 FFI.
: 如果你是说别的抽象方式,可以看看 effect handler
: http://okmij.org/ftp/Haskell/extensible/
: domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
: http://haskell.cs.yale.edu/?post_type=publication&p=802

avatar
w*g
64
我怎么记得FFI也是用IO monad实现的。比如下面的页面
https://www.haskell.org/haskellwiki/FFI_Introduction
C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
难道是我查得不对?
你这个claim有可能颠覆我的三观,不得不问问清楚。

IO

【在 a*****e 的大作中提到】
: 如果你是说底层,其实 IO Monad 就是 ST Monad 封装了诸多 FFI 而已,不想用 IO
: Monad,可以直接调用 FFI.
: 如果你是说别的抽象方式,可以看看 effect handler
: http://okmij.org/ftp/Haskell/extensible/
: domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
: http://haskell.cs.yale.edu/?post_type=publication&p=802

avatar
a*e
65
wdong 下面这段话写得非常好,我非常同意:

FP 主要理论就是 function is composable,推论是 that can be a great way of
programming。
前半句无可非议,后半句有争议。但是不可否认的是,the (re)discovery of Monad
是 FP 在这条路上的一个重要贡献。它的指导意义在于,I/Os do not compose like
functions, they compose like Monads。
这是一个 profound understanding of how program works,无论使用什么编程语言,
它的结构和特征都在那里。

【在 w***g 的大作中提到】
: 我怎么记得FFI也是用IO monad实现的。比如下面的页面
: https://www.haskell.org/haskellwiki/FFI_Introduction
: C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
: foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
: 难道是我查得不对?
: 你这个claim有可能颠覆我的三观,不得不问问清楚。
:
: IO

avatar
a*e
66
你的理解有一点点误差。没有任何理由可以阻止你写出如下声明:
foreign import ccall "set_icanon" set_icanon :: CInt -> ()
然后就可以像调用纯函数一样调用 I/O routine 啦!
之所以 FFI 提供 IO () 这样的声明方式,是为了立刻将有副作用的 FFI 调用封装到
IO Monad 里面去。要是想跳出 IO Monad,完全可以不用。

【在 w***g 的大作中提到】
: 我怎么记得FFI也是用IO monad实现的。比如下面的页面
: https://www.haskell.org/haskellwiki/FFI_Introduction
: C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
: foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
: 难道是我查得不对?
: 你这个claim有可能颠覆我的三观,不得不问问清楚。
:
: IO

avatar
w*g
67
抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
存在的问题。
你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
切地指的应该是imperative langauage里的I/O source code composition (Haskell里
的IO就是IO monad,没啥like不like的)。而source code composition只是text
composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
身,而是下面三点的自然推论:
1. monad能parse text。
2. imperative language能被parse。
3. I/O逻辑能用imperative language写出来。(有啥I/O逻辑不能用imperative
language写出来的?这个我也想不出来。)
你说的“profound understanding of how program works”的内容应该是:FP研究了
这么多年终于发现了programs是一些可以被parse的文本文件。等于啥都没说。(符合
范畴论的一般套路。)
为了检验上面的论断,我给出由上面的逻辑可以直接得到的两个推论,大家看是不是这
么回事。
1. 不光是IO,也不光是imperative language。不管是什么语言,只要能写的出来对应
的编译器(这个语言能被parse),那么这个语言里面对应的东西就能用monad写出来。
比如exception handling, java里的annotation,在imperative language里还不怎么
流行的aspect oriented programming,这些都能用monad写出来。这个转换如果不考虑
语法糖的话应该是可以用程序自动实现的。
2. Haskell里所有涉及到IO monad的代码都有等价的imperative language实现。
如果说monad有什么问题,那就是这个概念太抽象了,能做的事情太多了,一般人可以
掌握
IO monad, Maybe, List等各种monad的用法,但是要说精通不带修饰的“monad”那就跟
说我精通写文本文件一样是没有意义的。Monad在haskell里的作用是发明新的user-
defined
programming construction。
靠,abstract nonsense。

【在 a*****e 的大作中提到】
: wdong 下面这段话写得非常好,我非常同意:
:
: FP 主要理论就是 function is composable,推论是 that can be a great way of
: programming。
: 前半句无可非议,后半句有争议。但是不可否认的是,the (re)discovery of Monad
: 是 FP 在这条路上的一个重要贡献。它的指导意义在于,I/Os do not compose like
: functions, they compose like Monads。
: 这是一个 profound understanding of how program works,无论使用什么编程语言,
: 它的结构和特征都在那里。

avatar
w*g
68
我在GHC里试了,确实能正常运行。这个我以前确实不知道。如果能人肉保证函数没有
side effect的话是可以不加IO的。但是如果函数确实有side effect的话,那是有可能
引起错误的。所以你说的通过FFI进行I/O我还是无法接受。事实上main的类型就已经被
定死成IO (),IO monad是绕不过去的。



【在 a*****e 的大作中提到】
: 你的理解有一点点误差。没有任何理由可以阻止你写出如下声明:
: foreign import ccall "set_icanon" set_icanon :: CInt -> ()
: 然后就可以像调用纯函数一样调用 I/O routine 啦!
: 之所以 FFI 提供 IO () 这样的声明方式,是为了立刻将有副作用的 FFI 调用封装到
: IO Monad 里面去。要是想跳出 IO Monad,完全可以不用。

avatar
a*e
69
我不是很理解你说的用 monad 描述 parsing 和 monad 表述 I/O 有什么关系,
是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
applicative 或者 arrows 实现,和 monad 的实现各有优劣。
我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
不加限制的 monad composition 可以做到这点。
而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
不依赖于语言本身的求值顺序等特征。

【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:

avatar
w*g
70
是我搞混了,好久没用haskell了,都忘干净了。你把我文中的monad换成applicative
或这arrow,只要还能parse程序,那么我说的一切就应该还成立。

【在 a*****e 的大作中提到】
: 我不是很理解你说的用 monad 描述 parsing 和 monad 表述 I/O 有什么关系,
: 是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
: applicative 或者 arrows 实现,和 monad 的实现各有优劣。
: 我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
: 确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
: 不加限制的 monad composition 可以做到这点。
: 而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
: 为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
: composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
: 不依赖于语言本身的求值顺序等特征。

avatar
a*e
71
"有side effect的话,那是有可能引起错误的" 的前提是对 FFI 的调用不加限制。
IO Monad = ST Monad + RealWorld,这是一种限制方式。
但显然有其它限制方式,在发明出 IO Monad 以前 Main 可不是现在这个 type.

【在 w***g 的大作中提到】
: 我在GHC里试了,确实能正常运行。这个我以前确实不知道。如果能人肉保证函数没有
: side effect的话是可以不加IO的。但是如果函数确实有side effect的话,那是有可能
: 引起错误的。所以你说的通过FFI进行I/O我还是无法接受。事实上main的类型就已经被
: 定死成IO (),IO monad是绕不过去的。
:
: 到

avatar
w*g
72
如果仅仅是为了描述sequential I/O的话根本就不需要monad啥的。
你再想想看,monad要解决的是要描述由顺序选择循环这三个基本控制结构
可以写出来的IO逻辑。运行这个IO逻辑才产生了一系列sequantial I/O。

【在 a*****e 的大作中提到】
: 我不是很理解你说的用 monad 描述 parsing 和 monad 表述 I/O 有什么关系,
: 是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
: applicative 或者 arrows 实现,和 monad 的实现各有优劣。
: 我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
: 确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
: 不加限制的 monad composition 可以做到这点。
: 而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
: 为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
: composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
: 不依赖于语言本身的求值顺序等特征。

avatar
w*g
73
靠,我竟然悟到了这么精辟的道理。待我用英语把这个好好写写发到博客上。

【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:

avatar
a*e
74
"FP研究了这么多年终于发现了programs是一些可以被parse的文本文件。等于啥都没说
。"
上面这句话,我觉得有必要单独拿出来讲讲。
首先,我们谈的是 composition,而不是源代码写成 text 还是 AST。那么我问几个问
题:
1. (A ; B) ; C 等价于 A ; (B ; C) 吗?
2. A ; B 等价于 B ; A 吗?
3. A @ (B ; C) 等价于 (A @ B) ; (A @ C) 吗?
这里出现的 A B C 代表什么,而括号、分号、@号又代表什么,如果不定义清楚则
无法回答。
如果 ABC 代表自然数,括号表示优先级,分号是加法,@是乘法,那么三条对应的就是
结合律,交换律,分配律,都是满足的。
如果 ABC 代表互不干扰(也不先后干扰)的 Unix 进程,分号是并行执行(share
input),@ 表示 pipe,那么三条也都成立。但如果 ABC 是任意procedure,那么有可
能三条都不成立。
FP研究了这么多年终于发现了programs是可以表述为类型 M a,M 代表了副作用,a 代
表返回值。然后有三个特殊操作:
return :: a -> M a
fmap :: (a -> b) -> M a -> M b
join :: M (M a) -> M a

加上普通的函数操作就可以完整表述任意 imperative program 的组合方式,且满足以
下定律:
join . fmap join ≡ join . join
join . fmap return ≡ join . return = id
join . fmap (fmap f) ≡ fmap f . join
无需知道 M 的实现,无需知道语言的求值顺序,就可以对程序本身进行等价变换,用
于证明或者优化。
这,难道不是一个进步?

【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:

avatar
a*e
75
选择与循环和 monad 无关。前者依赖惰性求值,后者依赖递归。

【在 w***g 的大作中提到】
: 如果仅仅是为了描述sequential I/O的话根本就不需要monad啥的。
: 你再想想看,monad要解决的是要描述由顺序选择循环这三个基本控制结构
: 可以写出来的IO逻辑。运行这个IO逻辑才产生了一系列sequantial I/O。

avatar
a*e
76
回头又读一遍,我大概知道你要说什么了。
Monad 带来最直接,也最表层的影响,是语法上的。能够把一段代码作为 first class
citizen 对待,这其实也是一个 profound change。
Fist class citizen 的特点:可以作为参数传递,作为返回值,可以赋值给变量。
http://en.wikipedia.org/wiki/First-class_citizen
谈到组合方式,如果对象是 function,可以写成 f(g(x)),如果对象是代码,可以写
成 { A; B } 这在 C 语言里都能做到。问题是 C 和大部分语言里,只有 f g x 可以
是变量,而 A 和 B 则不可以。f(g(x)) 可以求值然后赋予一个变量,A; B 组合的结
果(一段新代码)则不可以赋值给变量。
猛一看似乎不好理解,但一旦接受了,则是一个非常自然的结果。就像越来越多的语言
都已经实现了 lambda 也即 first class function 之后,我相信,first class code
也即 IO Monad 也会逐渐流行起来。

【在 w***g 的大作中提到】
: 靠,我竟然悟到了这么精辟的道理。待我用英语把这个好好写写发到博客上。
avatar
w*g
77
不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
实现monad:
http://bartoszmilewski.com/2011/07/11/monads-in-c/
所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
么一套系统,不得不说是太牛B了。甩java好几条街。
(这个观点以前在这个版上被批判过,大家需要谨慎对待。)

class

【在 a*****e 的大作中提到】
: 回头又读一遍,我大概知道你要说什么了。
: Monad 带来最直接,也最表层的影响,是语法上的。能够把一段代码作为 first class
: citizen 对待,这其实也是一个 profound change。
: Fist class citizen 的特点:可以作为参数传递,作为返回值,可以赋值给变量。
: http://en.wikipedia.org/wiki/First-class_citizen
: 谈到组合方式,如果对象是 function,可以写成 f(g(x)),如果对象是代码,可以写
: 成 { A; B } 这在 C 语言里都能做到。问题是 C 和大部分语言里,只有 f g x 可以
: 是变量,而 A 和 B 则不可以。f(g(x)) 可以求值然后赋予一个变量,A; B 组合的结
: 果(一段新代码)则不可以赋值给变量。
: 猛一看似乎不好理解,但一旦接受了,则是一个非常自然的结果。就像越来越多的语言

avatar
d*i
78
大牛高见,对于鼓吹FP的原教旨主义者,还是得像你这样的对传统大众编程语言和FP都
认知很深的人来反驳他们自以为是的谬论来以正视听。

只是
mini

【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这

avatar
p*o
79
C++的lambda比函数指针的语法糖还是高级一些的 ...

【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这

avatar
c*9
80
函数指针和lamba完全不同的楖念,它不包合对所指如何操作的信息。用模板可以实现
FP,但不等于模板匹配就是Fp。汇用编什么Fp也都能实现。这样的想法就像知道了变量
可以替换
就以为自己掌握了代数学。

【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这

avatar
a*e
81
指针当然是 first class,但是函数指针不能够方便地组合,比如在 Haskell 里面写
f . g 的结果就是一个新函数,换到 C++ 里面就没有这么方便。
新的 C++ 标准提供了 lambda 语法糖,虽然需要手工指定 environment variable 也
不方便,但我觉得比有些其它语言里的方式要好。
总的来说,lambda 已经进入了主流语言的语法,是一件好事。但大部分非函数语言都
无法提供一个高效的实现。
另外,真正明晰的函数闭包语义需要严格区分 reference 和 value,这点上在
javascript, ruby, python, perl, 包括 swift 里面,都做得不好,甚至不如 C++。
最后的结果就是 lambda 和 closure 不好用,主要用途也都是充当一个回调的语法糖
而已。归根结底还是因为语义不明晰,这些语言设计者还不能够理解函数语言的精髓。

【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这

avatar
a*e
82
另外针对 C++ 的模板,你当然可以说它是 FP,它也足够强大,turing complete 么。
甚至 C 里面的宏,你也可以说它是 FP,因为都是 stateless rewrite rules 么。
可以这么做,但不代表好用,至少我是尽量避免使用 C++ 模板,因为错误信息完全看
不懂。当然我不敢说自己是个多好的 C++ 程序员,我写 C 甚至 Java 都比 C++ 时间
长多了。
最后,你给的链接是 Bartosz Milewski 的文章,这哥们早几年前就从 C++ zealot 变
成 Haskell convert 了,现在为 FP Complete 工作,最近在忙着写 category theory
的书。

【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这

avatar
w*g
83
文章作者convert并不能说明什么。要搞programming language的话基本上就得用
haskell。
C++的模板是有类型系统的,现在可能不完善吧,但是至少是可以完善的。
另外C++里的lambda就是语法糖,所有的lambda都可以通过定义一个重载了()方法的类
来实现。本质上就是带一个隐含this指针参数的函数指针。你说的子程序签套运算我怀
疑C++11也可以用库来实现,但都不能避免side effect的问题。
我Google了下FP的定义
In computer science, functional programming is a programming paradigm, a
style of building the structure and elements of computer programs, that
treats computation as the evaluation of mathematical functions and avoids
changing-state and mutable data.
我觉得关键还是avoid changing-state and mutable data。所有这些带lambda的语言
基本上都不支持functional data structure。我觉得他们离FP还差得很远。
我最近写C++就碰到这么一个case。就是一个递增的数据结构有n个线程读,有一个
线程写,如果有functional data structure可以用的话就会非常爽,因为做
snapshot的成本为0. 最后解决方案只能是维护两个版本的数据结构,一个读一个写,
写完了swap一下指针。

theory

【在 a*****e 的大作中提到】
: 另外针对 C++ 的模板,你当然可以说它是 FP,它也足够强大,turing complete 么。
: 甚至 C 里面的宏,你也可以说它是 FP,因为都是 stateless rewrite rules 么。
: 可以这么做,但不代表好用,至少我是尽量避免使用 C++ 模板,因为错误信息完全看
: 不懂。当然我不敢说自己是个多好的 C++ 程序员,我写 C 甚至 Java 都比 C++ 时间
: 长多了。
: 最后,你给的链接是 Bartosz Milewski 的文章,这哥们早几年前就从 C++ zealot 变
: 成 Haskell convert 了,现在为 FP Complete 工作,最近在忙着写 category theory
: 的书。

avatar
N*K
84
fp语言能用来做数字电路编程么?
能用来做控制系统编程么?

【在 a*****e 的大作中提到】
: "FP研究了这么多年终于发现了programs是一些可以被parse的文本文件。等于啥都没说
: 。"
: 上面这句话,我觉得有必要单独拿出来讲讲。
: 首先,我们谈的是 composition,而不是源代码写成 text 还是 AST。那么我问几个问
: 题:
: 1. (A ; B) ; C 等价于 A ; (B ; C) 吗?
: 2. A ; B 等价于 B ; A 吗?
: 3. A @ (B ; C) 等价于 (A @ B) ; (A @ C) 吗?
: 这里出现的 A B C 代表什么,而括号、分号、@号又代表什么,如果不定义清楚则
: 无法回答。

avatar
w*g
85
应该可以的。我上面帖子已经论证了FP里面用monad可以实现
所有可以parse的语言的功能。Haskell用来实现一个类似
verilog或者VHDL之类的系统应该也能做得很漂亮。而且
数字电路编程完全对应编译期计算,没有状态,很容易做
到纯functional。

【在 N******K 的大作中提到】
: fp语言能用来做数字电路编程么?
: 能用来做控制系统编程么?

avatar
a*e
86
Google Bluespec.
这个是个比 Verilog 抽象层面高一点的商业系统,最初的 surface language 是比较
彻底的 FP,后来为了迎合大多数 C/C++ 背景的程序员,改成了现在这个样子,但本质
还是 FP 没错。

【在 N******K 的大作中提到】
: fp语言能用来做数字电路编程么?
: 能用来做控制系统编程么?

avatar
d*i
87
时序逻辑电路都有状态,怎么可能没有状态?看不出haskell怎么可能实现VHDL和
Verilog的功能

【在 w***g 的大作中提到】
: 应该可以的。我上面帖子已经论证了FP里面用monad可以实现
: 所有可以parse的语言的功能。Haskell用来实现一个类似
: verilog或者VHDL之类的系统应该也能做得很漂亮。而且
: 数字电路编程完全对应编译期计算,没有状态,很容易做
: 到纯functional。

avatar
a*e
88
的确是这样。声称自己是 FP 语言的通常有两类,一种是支持 first class function
,一种是支持 immutable by default 的。比如 Single Assignment C (SAC),都不支
持 higher-order function,但通常也被认为是 FP。

【在 w***g 的大作中提到】
: 文章作者convert并不能说明什么。要搞programming language的话基本上就得用
: haskell。
: C++的模板是有类型系统的,现在可能不完善吧,但是至少是可以完善的。
: 另外C++里的lambda就是语法糖,所有的lambda都可以通过定义一个重载了()方法的类
: 来实现。本质上就是带一个隐含this指针参数的函数指针。你说的子程序签套运算我怀
: 疑C++11也可以用库来实现,但都不能避免side effect的问题。
: 我Google了下FP的定义
: In computer science, functional programming is a programming paradigm, a
: style of building the structure and elements of computer programs, that
: treats computation as the evaluation of mathematical functions and avoids

avatar
w*g
89
电路运行的时候有状态,但是电路本身是个静态的东西,一点烧成了就不能变了。
绝对是functional的。(对应haskell里的main,main这个IO monad本身是个静态的东西,
程序一旦编译完成就不能再变了。)

【在 d****i 的大作中提到】
: 时序逻辑电路都有状态,怎么可能没有状态?看不出haskell怎么可能实现VHDL和
: Verilog的功能

avatar
d*i
90
你这个指的是物理上的状态,那当然是静态,但是数学上的状态电路都有,就是f(t)取
决与f(t-1),....f(t-N)的所有状态。

西,

【在 w***g 的大作中提到】
: 电路运行的时候有状态,但是电路本身是个静态的东西,一点烧成了就不能变了。
: 绝对是functional的。(对应haskell里的main,main这个IO monad本身是个静态的东西,
: 程序一旦编译完成就不能再变了。)

avatar
a*e
91
支持状态不代表不是 FP 啊!你需要思考一下,状态本身是否需要用 destructive
update 来建模?
对信号最直观的抽象就是把它们看作关于时间的函数: Signal a = Time -> a 这个是
所谓 FRP (Functional Reactive Programming) 的核心。

【在 d****i 的大作中提到】
: 时序逻辑电路都有状态,怎么可能没有状态?看不出haskell怎么可能实现VHDL和
: Verilog的功能

avatar
w*g
92
VHDL和verilog只是描述电路连线的啊。你说的这个是simulation的功能吧?
用haskell写完电路描述后用runtime对它做simulation,我觉得应该没问题。

【在 d****i 的大作中提到】
: 你这个指的是物理上的状态,那当然是静态,但是数学上的状态电路都有,就是f(t)取
: 决与f(t-1),....f(t-N)的所有状态。
:
: 西,

avatar
a*e
93
这个领域的确有这样的分界,一个是描述电路本身(Verilog 等),一个是描述电路是
用来做什么(Simulink 等)并期望能够把这种描述变成可生产的电路。后者可以走得
很远,比如把 C (或者 Haskell) 程序直接编译到 FPGA。

【在 w***g 的大作中提到】
: VHDL和verilog只是描述电路连线的啊。你说的这个是simulation的功能吧?
: 用haskell写完电路描述后用runtime对它做simulation,我觉得应该没问题。

avatar
w*g
94
我一直没有意识到后者的存在。再一想,理论上似乎也是可行的。长见识了。

【在 a*****e 的大作中提到】
: 这个领域的确有这样的分界,一个是描述电路本身(Verilog 等),一个是描述电路是
: 用来做什么(Simulink 等)并期望能够把这种描述变成可生产的电路。后者可以走得
: 很远,比如把 C (或者 Haskell) 程序直接编译到 FPGA。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。