论坛首页 综合技术版 数据结构和算法

函数的副作用及其他

浏览 5666 次
该帖已经被评为良好帖
作者 正文
时间:2008-04-03
又看了一遍这个帖子

回albertLee:关于Category Theory 和Monad
http://www.javaeye.com/post/428151

虽然还是没有看懂帖子内容.
但是,这次我仔细看了后面的回帖.才发现,早就有人已经提出了我提出的那些问题.汗颜.
而且,我连 Walder 1992 论文都没有看过. 也不知道有这样一篇论文.
ajoo 也早就提到了 Monad 和 chain of command 的关系.
这些理论上的差距, 不是一点半点.

Trustno1 写道

拿IO系统来说,当时Haskell并非采用的是Monad,而是备选了两种方案.一种称为Dialogue这种方案原理上就是SICP第三章中描述的stream,在实现上非常像Erlang的Message passing.它把Input,Ouput想象成两条无穷列表,往外output就是像输出表中发送一系列request,而input就是读取输入表中的response.另外一种则是基于continuations方式的,设计了get和put两个原语.
以continuation的方式将其组合起来比如说
引用
echo:Result->Result
echo c=get(\a->if (a==eof)
then c
else put a (echo c))
当时Haskell的作者们发现Dialogue和contiuation实则上并不互相冲突,而且在形式上两者可以互相转换,因此在到底选取哪一个当作标准原语的问题上争执不下.一方面continuation方式比较适合程序员的思维而且与Haskell的原生语法保持一致,但是在效率上需要线性空间和平方时间的开销,另一方面流放式难以被程序员们接受并且需要引入一个独特的no-determinisim操作符来解决并发问题使得语法和解释器都要引入对特殊语法的支持,但是这个方案有着常数空间和线性时间的高效率.最后效率派占上风,以dialogue方式作为原语,用continuation包装上层的API.


原来, Dialogue 和 Continuation 是这么回事.
我看到一些资料里面提到 Haskell 的 Dialogue 和 Continuation. 但是没有看懂是怎么回事.

-----------------------------------------------

Truston1 写道

范畴论很难吗?又不是要你去证费马大定理.不懂怎么办?简单阿学呗!谁生出来就是懂数学的?你又不是贾宝玉.


难, 不难的话,咱也不会回到经验归纳的老路上.
T1自己也说了.

Trustno1 写道

记得上次看到lich_ray讨论Monad实现state的时候也用了别扭两个字来概括,认为Monad在这方面不如continuation来的直观。.因此学习haskell,除非你是像ajoo那样脑瓜很不错的人,否则你就只能下苦功夫靠不断写程序去适应这种思维。


我就是听城里人讲了一些新鲜事, 引起了一点好奇心 (我们村里人娱乐活动不多,总看着城里人在搞些啥), 想弄明白城里人说的是什么.
事情要一步步来, 我是连经验总结/Walder 92的阶段都没有经过.就跳过去看城里人提到的那些资料.这超越了现阶段的生产力.

我还远远不到 Walder 92 大侠的水平, 这个经验总结的层次上, 我还要努力.
至于数学,范畴,这个我的起点就更低了.只能慢慢来,说不定,某天就开窍了.

---------------------------

Random, Error和 IO 的相似点.
我是这么认为的.
Random的生成,也是要根据系统的一些全局随机信息(比如系统时间).这有些象 input.
Error属于异常情况,可能要对系统发出一些警告,比如 throw, print.这有些象 output.

另外, do notation, 我还是没有彻底明白.
好像 input 前面不需要加 do, output 前面一定要加 do.
是这样吗?
   
0 请登录后投票
时间:2008-04-03
要是按这个思路来理解“要不要加 do”,那你要理解的东西就可能太多了。确实需要补充一些 Lambda 演算和状态方面的知识。
   
0 请登录后投票
论坛首页 综合技术版 数据结构和算法

跳转论坛:
JavaEye推荐