免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3163 | 回复: 2
打印 上一主题 下一主题

Haskell版累加器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-24 17:44 |只看该作者 |倒序浏览
本帖最后由 KanonInD 于 2011-12-26 10:59 编辑

累加器需要副作用,而 IO Monad 和IORef正好提供副作用操作,因而再结合词法作用域就可以用来实现累加器了。
  1. module Main where

  2. import Data.IORef
  3. import Text.Printf

  4. counter :: (Num a0) => a0 -> IO (a0 -> IO a0)
  5. counter n = do
  6.   nIO <- newIORef n
  7.   return $ \x -> do i <- readIORef nIO
  8.                            writeIORef nIO (i+x)
  9.                            readIORef nIO>>=return

  10. main = do
  11.   c1<-counter (10::Int)
  12.   c2<-counter (1::Float)
  13.   c1 1>>=printf "c1 == %d\n"
  14.   c2 2>>=printf "c2 == %f\n"
  15.   c1 1>>=printf "c1 == %d\n"
  16.   c2 2>>=printf "c2 == %f\n"
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-26 11:07 |只看该作者
本帖最后由 tangboyun 于 2011-12-26 11:43 编辑

计数的话, 只需要基本类型(维护这个信息和拷贝复制的代价很小),为啥不直接用State Monad(一个Monad interface维护的pure func)而要使用IO和IORef呢?
需要读写内存位置的话: ST
需要读写文件: IORef
需要系统调用等等: IO
以上个人看法。

论坛徽章:
0
3 [报告]
发表于 2011-12-26 20:14 |只看该作者
之所以这样写是受Lisp/Scheme的影响,下面的是Scheme的累加器:
  1. (define (counter n) (lambda (i) (set! n (+ n i)) n))
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP