鉴于blogger常年在墙外,严重影响了发贴的心情。终于搭建了自己的博客。 http://www.yi-programmer.com/blog/ 博客的成功运转跟下面这些光辉的名字是分不开,向创造这些东西的大牛们表示致敬,谢谢git,谢谢make,谢谢python,谢谢docutils,谢谢mako,谢谢pygments,谢谢latex。
2010年4月10日星期六
2009年4月23日星期四
2009年4月20日星期一
学习Haskell
学习Haskell
monad与状态
monad与状态
最近重新捡起haskell来看了看,似乎对monad和程序状态的关系有点小小的明白了。强烈希望明白人指点一下。
话说用命令式语言写程序的时候,有明白人就强烈要求不要用全局变量不要用全局变量,其实要取消所有的全局变量也容易,不过就是增加几个参数而已,比如这样的程序:
int 全局变量=0;
void inc(){全局变量+=1;}
void dec(){全局变量-=1;}
void main(){inc(); dec();}
改成这样就成了:
void inc(int *变量){*变量+=1;}
void dec(int *变量){*变量-=1;}
void main(){int 全局变量=0; inc(&全局变量); dec(&全局变量);}
其实说起来,搞个全局变量也就是为了让函数少写几个参数而已。参数实在太多了,大不了就搞个 struct stat 把公用的参数给包装成一个。
函数式编程号称不准修改状态,那大不了就每次改都创建一份新的,然后返回了,这样程序就变成这样了:
void inc(状态,...){...; return 结果和新状态;}
void dec(状态,...){...; return 结果和新状态}
void main(){
初始状态;
新状态, 返回值 = inc(初始状态,...);
新状态2, 返回值 = dec(新状态,...);
}
这样所有函数都要多加一个状态参数,要多返回一个新状态。麻是麻烦点,不过据说都要玩并行计算了嘛,忍了。
那么可以把状态这个东西本身抽象了一下,我们用python来模拟一下吧,假设原来的程序是这样的:
global_stat = []
def inc1(stat, input):
return stat+['inc1'], input+1
def inc2(stat, input):
...
return stat+['inc2'], input+2
a = 1
new_stat, a1 = inc1(global_stat, a)
new_stat, a2 = inc2(new_stat, a1)
global_stat = []
def inc1(stat, input):
return stat+['inc1'], input+1
def inc2(stat, input):
...
return stat+['inc2'], input+2
a = 1
new_stat, a1 = inc1(global_stat, a)
new_stat, a2 = inc2(new_stat, a1)
为了简化这个问题,我们引入一个 bind 函数来进行抽象:
def bind(func1, func2):
def lazy_bind(stat, value):
new_stat, return_value = func1(stat, value)
func2(new_stat, return_value)
return lazy_bind
# 然后就可以这样来调用 inc1,inc2...
bind(inc1,
bind(inc2,
bind(xxx,
...
))...) (init_stat, defaut_value)
就我们这个例子来说,后面这种方式除了让程序更加诡异以外看不出来有什么特别的好处。
但是对于 Haskell 来说,很多基本的东西(IO)都是构建与这种类型的抽象之上,并且提供一些语法糖让代码变得更好看,这样一种抽象方式也就成为理解haskell程序很重要的一个东西了。
而haskell之所以说能够通过这种抽象方式来隔离纯代码和有副作用的代码(比如说具体的IO操作)就我个人理解就是因为可以把有副作用的代码放到bind里面执行,从而保证 inc1、inc2 这种函数的纯粹性。
标签: functional, haskell
2009年1月20日星期二
所谓日久生情
不要怀疑,这个日就是你心里想的那个日,而且是被。 意思是说,再郁闷的东西,被郁闷久了,也总能从中发掘出一些稍微好玩一点的东西出来。 http://huangyilib.googlecode.com/svn/trunk/doc/js_best_practice.html 当然,玩python的兄弟就不要点了,主要是用来忽悠没玩过动态语言的朋友的。
标签: javascript
2008年12月26日星期五
2008年11月12日星期三
linux下的半透明窗口
2008年11月11日星期二
订阅:
博文 (Atom)
Profile
- 黄毅
- 深圳, 广州, China
- I Love Python !
Recent Posts
Recent Comments
Tags
- 设计模式 (1)
- ajax (3)
- allegra (1)
- cherrypy (1)
- compiler (1)
- continuation (2)
- descriptor (1)
- django (17)
- dotnet (1)
- framework (2)
- functional (1)
- genshi (1)
- gtk (1)
- haskell (1)
- inkscape (1)
- IronPython (2)
- javascript (1)
- libevent (1)
- mako (1)
- metaclass (4)
- mochikit (1)
- network (1)
- newforms (1)
- orm (1)
- others (18)
- paste (1)
- PEAK (1)
- pickle (1)
- ply (1)
- pocoo (1)
- pypy (3)
- python (38)
- python3000 (3)
- rails (2)
- REST (3)
- sqlalchemy (3)
- stackless (3)
- turbogears (1)
- tutorial (1)
- vim (1)
- web (11)
- wsgi (1)