随笔-341  评论-2670  文章-0  trackbacks-0
    我们知道,循环本身是没有返回值的。所以在纯函数式语言下,跟IO有关的循环才有足够的副作用来产生价值。于是利用IO Monad,我们就可以实现循环了。循环是一个函数:
1 def ioloop count code = 
2   let
3     def _loop index = 
4       if (index>=count)
5         iovoid
6         ((code index) >>> (_loop (index+1)))
7   in _loop 0

    这个函数输入count,然后执行code。code接受一个参数代表目前循环的次数,循环次数从0到count-1之后结束。最后函数返回IO void。如果循环中出现错误,那么立刻返回错误。我们可以尝试写一段代码:
 1 def main125 = do
 2   writeln "现在开始计算1到10的平方:";
 3   ioloop 10 \index->do
 4     number = return (index+1);
 5     write ((itoa number) + "*" + (itoa number) + "=");
 6     square = return (number * number);
 7     writeln (itoa square);
 8   end;
 9   writeln "结束!";
10 end

    执行结果如下:
 1 现在开始计算1到10的平方:
 2 1*1=1
 3 2*2=4
 4 3*3=9
 5 4*4=16
 6 5*5=25
 7 6*6=36
 8 7*7=49
 9 8*8=64
10 9*9=81
11 10*10=100
12 结束!
13 main125返回值:(system.success (system.pair <VOID> <USER>))
posted on 2008-12-15 07:56 陈梓瀚(vczh) 阅读(2116) 评论(2)  编辑 收藏 引用 所属分类: 脚本技术

评论:
# re: 在纯函数式语言内实现有关IO的循环 2008-12-15 21:37 | haskell
纯函数式语言不能map IO吗?可以吧,
为什么不弄个通用的map呢  回复  更多评论
  
# re: 在纯函数式语言内实现有关IO的循环 2008-12-16 01:03 | 陈梓瀚(vczh)
这只是一个demo。一个目标永远有无穷多种方法可以完成的。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理