标题党了,阿门。其实更像C++,java之类语言中的引用。这就是Data.IORef中的IORef,使用它可以创建真正mutable的变量。
在do-notation中可以写这样的代码:
do { … x< - return x+1; }
很像变量,但其实不是真正的mutable,因为它本质上就是(\x -> ..) x+1 ,两个x不在同一个scope,内存中没有值发生改变。
而Data.IORef则是在内存中搞一块地方,提供对这一块内存中输入输出的函数,并通过IO monad将它隔离开,这样就有点真正的变量的意思啦。大致就这几个函数:
newIORef :: a -> IO (IORef a) --创建一个新的IORef(废话~,不过有时也觉得haskell挺”面向对象”的…) readIORef :: IORef a -> IO a writeIORef :: IORef a -> a -> IO ()
太直白了,一个读一个写,都是IO操作,只不过操作的对象不是标准输入输出,而是内存里的一个值。值得一提的是,haskell的惰性求值让它只有在必要的时候才会读取,这样一来在传递参数的时候就不会访问值所在的内存,就像C中传递一个指针那样节约。唉,发明haskell的那个委员会真是一群天才。
Ps:学习haskell到熟悉基本的语法之后,强烈推荐那个《make yourselves a scheme in 48 hours》的教程!通过用haskell实现一个完整的scheme,对于monad,类型系统的理解绝对会大有好处!

“haskell的惰性求值让它只有在必要的时候才会读取”
重点内容读取完毕
@wangweinoo1 前几天从一本编译原理的书上看到一种按名传参的方式(与按值和按地址相对),惰性求值貌似是它的一种变体。不过惰性求值不只是传参,还有很多有趣的特性
哦,奇怪,Lisp 不是也支持 FP 么?
@xpycc lisp是第一门支持fp的语言,不过lisp还不够纯–要mutable的变量直接一个set!就是了,也就是有一定的副作用。haskell则是纯粹的fp(心虚),搞个变量之类要到monad那里绕个弯来把副作用隔离,貌似要麻烦些。不过有强大的类型系统为后盾,haskell的程序要更健壮些。
@ssword 哦,原来是这样,印象中 Lisp 是个庞杂的语言,支持多种范式,据说很NB 。
最近没什么打算,毕竟分数还没出来。可能会仔细学 FP ,也可能重读 CLRS 。
厄,晕了,输入输出函数不会用,救救我……
@xpycc 呵呵,输入输出可是haskell的进阶内容呢。在《learn you a haskell for great good》这个教程里,输入输出被安排在了第九章。学习haskell输入输出之前最好先对monad有个大致了解,而学习monad之前最好先对class/instance有个了解,这个不急 :)
没事过来膜拜膜拜haskell大牛