我是haskell的初学者,并使用最新的GHCi 2011.2.0.1。我经常遇到的一个挫折是,互联网和书籍中的例子(甚至来自官方的haskell.org网站,例如http://www.haskell.org/haskellwiki/State_Monad的示例-2)都不会编译。它需要几轮狩猎和发布问题才能找出问题所在。甚至RWH书中的一些例子都不起作用。
这是新版本的haskell还是haskell-platform的问题?语言/平台是否正在开发且不稳定,或者只是示例已过时?无论哪种方式,新学生找到正确的例子来学习的最佳方法是什么?
更具体地说,您可以帮助修复上面提到的状态monad示例吗?
答案 0 :(得分:9)
在这种情况下,问题是在最新版本的Monad Transformer Library中删除了State
构造函数。如果您使用State
替换getNext
定义中state
的使用,那么该程序就可以正常运行。 (这是因为State
被重新定义为StateT Identity
,即身份monad上的状态monad转换器,因此已删除单独的数据类型。如果您不知道这意味着什么,请不要不用担心;只是意味着每当你看到它时都必须用State
替换state
。)
网络或RWH中现有示例的大多数问题仅仅是由于新版本的库。 (我认为RWH的例子的主要问题是Parsec示例是为Parsec 2编写的; Parsec 3改变了很多,所以至少你可能需要添加一些导入。)
一般来说,Haskell确实没有足够的最新,有用的资源; HaskellWiki页面似乎没有维护。 (虽然HaskellWiki确实是官方的haskell.org网站,但页面是由用户编写和维护的,所以只是因为维基上的某些内容并不一定意味着它是最新的或高质量的。)
删除了State
的Monad Transformer Library版本于2010年10月发布,所以很遗憾还有很多代码因为这个而无法与新版本一起使用。谢天谢地,修复很简单。