论坛首页 海阔天空论坛

对不起.我也喜欢跳大神...

浏览 10837 次
精华帖 (8) :: 良好帖 (0) :: 灌水帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-08-31  
Saito 写道
     倒是有一个疑问. 函数式编程在不可避免的需要大量保存state的情况下. 用monad是不是还不如直接像scala之类的直接用oo直接处理掉..(适用场景: I/O GUI  etc .. ).  pure fp 在 gui 方面貌似不是很在行啊..

如果你想尽情享受名词轰炸的话,你可以看看reactive programming的相关资料,然后functional reactive programming……FP跟GUI不是天生对立的 =v=

我……我一直有个不成熟的看法,拿出来晾晾:一般来说FP让我们可以少显式指定东西,例如我们不必显式指定某个函数是否要用循环;写得少了,“威力”却更大了。如果一个函数是尾递归的,那么编译器/运行时理论上可以选择最适合当时的执行状况的实现方法,例如说在单核单线程上用单个大循环,在多核多线程上通过分析数据依赖性来把运算拆分到多个线程上的小循环。类似的分析,对用命令式语言写出来的程序不是不能做,而是有时候为了保证程序语义,很多优化只能保守的做,很别扭。命令式语言里,有时候可以抽出公共子表达式的地方,可能会因为指针的别名分析有困难而只好放弃;纯FP语言则可以激进的做优化,比较好分析。
我想说的是,我们写得少了,给出的自由度高了之后,现代的编译器/运行时才能更好的工作,反而能帮我们做更多事情。以前有人提出过一种语言结构,看起来跟顺序结构类似,但显式规定了其中的语句的执行顺序是未定义的。多好。

基本上FP没硬件直接支持,都得靠软件来实现其语义。像消息传递风格的编程,如果真的每次传递消息都把整条消息复制来复制去,那效率肯定很糟糕。有些系统是给消息贴上token,真正复制的只是token,消息的实际内容放在buffer里,由系统来控制其ownership。只要同一之间只有“一个人”拥有某条消息的ownership,它就跟“复制了”表现得一样,因为状态再怎么变也无法被其它部分观测到。
所以之前我说FP思想很重要,实现方式也很重要;后者反而又会涉及大量命令式的内容……呵呵
0 请登录后投票
   发表时间:2009-09-02  
RednaxelaFX 写道
iaimstar 写道
从第一次听到鲁棒×性这个词
我就觉得好和谐
今天还有玉米啃,太和谐了

从第一次听到鲁棒性这个词我就往下想……为了不往下想,还是啃啃玉米好了

@Saito
中文wiki的可靠度经常跟伪基有的一拼……三条规则很好理解
啊发就是换个马甲
啊呗就是把鸡蛋装篮子里
啊唉就是装着鸡蛋的篮子跟不装鸡蛋的篮子都一样是篮子
...@"_"|||...



数学上是复合函数。支持复合函数应该是FP不同于命令式地把操作当成更主要的操作对象,而不是数据。因此对操作的分派会更灵活,对数据的处理性能不高。把副作用隔离就是把对操作的操作和对数据的操作分离。

但是我不确定复合函数是不是非常必要。
0 请登录后投票
   发表时间:2009-09-03   最后修改:2009-09-03
不涉及副作用的代码,没有时间因子,说玄点就是不受因果律限制,可以编译期运行,把调用替换成结果,也就是可以做最大限度的优化。

pure FP 便是从语法上区分了副作用(当然语法上不区分也有可能做这种优化,只是不好做)。

-----

现在的编译器已经非常 nb 了,像 gcc 的 -O3 选项会把一些循环展开成并行的,但还是不够智能。
如果把遍历操作抽象出来(map、filter、fold ……),编译器就知道哪些循环是顺序无关,哪些是顺序有关,并行化的优化也会更出色。

要做性能比较的话,可以说:函数式是自动档,命令式是手动档,如果你的技术高超,精力无限,手动档最 imba,不然还是自动档的比较来风。

优化性能的话,好钢用在刀刃上,大部分设成自动档,让程序员集中精力搞瓶颈的效果更好。所以性能 critical 的程序经常会见到混合编程。(譬如游戏就经常是脚本结合 C++ 甚至汇编)

-----

复合函数可以看作一种 eval。eval 有多强大多 evil 大家都知道 ……
复合函数还可以看做泛型、模版、Annotation/Attribute …… 一个特性满足 n 个愿望 ……

语法糖不是无关紧要。糖是 pattern 的抽象,你用到这种模式时不用搬来教科书抄一遍,直接糖就行了,糖多了往往能揭示另一种思维角度的效果。
譬如 rails 大量出现的糖 &:xxx,看起来就像 FP 语言里传递一个函数一样。
又如 scala 的下划线语法糖(如 sortBy(_<_),看起来已经很像 haskell 的 sortBy (<) 了),它清晰表明了传递的是计算而不是变量,就不用费脑筋想自变量的名字了。

复合函数的灵活,意味着你可以定义一些看起来很像新语法的结构,或者糖。有了自己的糖,描述离不开 专业术语、黑话、行话的领域逻辑就更方便,更靠近业务了,便是所谓的 DSL。

-----

C++ 和 java 的区别不仅在于内存分配,还在于声明。 C++ 可以拆分声明和定义,但是不声明的东西就不能用,所以程序员还要自己控制声明的顺序。
java 就不需要指定声明的顺序,定义了一个类,便相当于所有其它代码都知道了这个类,不需要 include 相应的 .h 文件就能用到这个类(注意 import 和 include 不同,package 相当于 namespace,import 相当于 using)。

这种设计的好处就是声明式代替命令式,程序员不需要考虑代码的编写顺序了,顺序无关(楚轩:脱离因果律制约哦)可以推动另一种程度的并行化 —— 代码编写的并行化。这是对团队协作的作用。

object 和 closure 本质上没什么不同,class 声明可以 morphism 到 FP 中去,纯 FP 无非是彻底一点,把声明式贯彻到底,还原出一个纯粹的世界。
没有 object 和 class 的 lisp 和 haskell 也能做 OO 的设计, a.do(sth) 和 do a sth 只是语序的区别而已。
0 请登录后投票
   发表时间:2009-09-03  
night_stalker 写道
不涉及副作用的代码,没有时间因子,说玄点就是不受因果律限制,可以编译期运行,把调用替换成结果,也就是可以做最大限度的优化。

pure FP 便是从语法上区分了副作用(当然语法上不区分也有可能做这种优化,只是不好做)。

百度百科!!! 写道
辨证唯物主义的因果律:认为任意宇宙状态都是其前宇宙状态积累的结果。任意运动状态均是其前运动状态积累的结果。具有最为广泛的普遍性。


    话说我长这么大都是由以前一直在吃的这个状态累积的结果..  XDD
0 请登录后投票
   发表时间:2009-09-03   最后修改:2009-09-03
赋值既IO,IO既通信,通信既时序,此乃命令式语言的不传之密.
0 请登录后投票
   发表时间:2009-09-03   最后修改:2009-09-03
Trustno1 写道
赋值既IO,IO既通信,通信既时序,此乃命令式语言的不传之密.


真是奇妙 …… 可惜小波分析的课没去上过 ……

Saito 写道
night_stalker 写道
不涉及副作用的代码,没有时间因子,说玄点就是不受因果律限制,可以编译期运行,把调用替换成结果,也就是可以做最大限度的优化。

pure FP 便是从语法上区分了副作用(当然语法上不区分也有可能做这种优化,只是不好做)。

百度百科!!! 写道
辨证唯物主义的因果律:认为任意宇宙状态都是其前宇宙状态积累的结果。任意运动状态均是其前运动状态积累的结果。具有最为广泛的普遍性。


    话说我长这么大都是由以前一直在吃的这个状态累积的结果..  XDD


- - 我讲多错多,扯淡起来受无限流影响,当 joke 看就行了

  • 大小: 402.7 KB
0 请登录后投票
   发表时间:2009-09-03  
night_stalker 写道
Trustno1 写道
赋值既IO,IO既通信,通信既时序,此乃命令式语言的不传之密.


真是奇妙 …… 可惜小波分析的课没去上过 ……

Saito 写道
night_stalker 写道
不涉及副作用的代码,没有时间因子,说玄点就是不受因果律限制,可以编译期运行,把调用替换成结果,也就是可以做最大限度的优化。

pure FP 便是从语法上区分了副作用(当然语法上不区分也有可能做这种优化,只是不好做)。

百度百科!!! 写道
辨证唯物主义的因果律:认为任意宇宙状态都是其前宇宙状态积累的结果。任意运动状态均是其前运动状态积累的结果。具有最为广泛的普遍性。


    话说我长这么大都是由以前一直在吃的这个状态累积的结果..  XDD


- - 我讲多错多,扯淡起来受无限流影响,当 joke 看就行了

    我小波分析倒是去上了. 除了听了第一节课老师讲了讲小波分析的历史. 到第二节课过渡到傅里叶变换的时候. 我就彻底昏睡过去了.. 话说比数学分析是难多了.. 基本不在一个难度次元上..
0 请登录后投票
   发表时间:2009-09-03  
Saito 写道
night_stalker 写道
不涉及副作用的代码,没有时间因子,说玄点就是不受因果律限制,可以编译期运行,把调用替换成结果,也就是可以做最大限度的优化。

pure FP 便是从语法上区分了副作用(当然语法上不区分也有可能做这种优化,只是不好做)。

百度百科!!! 写道
辨证唯物主义的因果律:认为任意宇宙状态都是其前宇宙状态积累的结果。任意运动状态均是其前运动状态积累的结果。具有最为广泛的普遍性。


    话说我长这么大都是由以前一直在吃的这个状态累积的结果..  XDD


貌似此因果律讲的是决定论。原文的因果律不做评价。
0 请登录后投票
   发表时间:2009-09-03  
night_stalker 写道
Trustno1 写道
赋值既IO,IO既通信,通信既时序,此乃命令式语言的不传之密.


真是奇妙 …… 可惜小波分析的课没去上过 ……


这个蛋,应该怎么扯法?
0 请登录后投票
   发表时间:2009-09-03   最后修改:2009-09-03
Saito 写道
night_stalker 写道
Trustno1 写道
赋值既IO,IO既通信,通信既时序,此乃命令式语言的不传之密.


真是奇妙 …… 可惜小波分析的课没去上过 ……

Saito 写道
night_stalker 写道
不涉及副作用的代码,没有时间因子,说玄点就是不受因果律限制,可以编译期运行,把调用替换成结果,也就是可以做最大限度的优化。

pure FP 便是从语法上区分了副作用(当然语法上不区分也有可能做这种优化,只是不好做)。

百度百科!!! 写道
辨证唯物主义的因果律:认为任意宇宙状态都是其前宇宙状态积累的结果。任意运动状态均是其前运动状态积累的结果。具有最为广泛的普遍性。


    话说我长这么大都是由以前一直在吃的这个状态累积的结果..  XDD


- - 我讲多错多,扯淡起来受无限流影响,当 joke 看就行了

    我小波分析倒是去上了. 除了听了第一节课老师讲了讲小波分析的历史. 到第二节课过渡到傅里叶变换的时候. 我就彻底昏睡过去了.. 话说比数学分析是难多了.. 基本不在一个难度次元上..

小波,是难了一些要学一些复分析,当然你不去搞测度那套东西复分析也不是很难.DFT其实没啥难的,就是高数加上中学里的三角函数运算而已.
0 请登录后投票
论坛首页 海阔天空版

跳转论坛:
Global site tag (gtag.js) - Google Analytics