Haskell示例经常无法正常工作。

4
我是一个Haskell的初学者,正在使用最新版本的GHCi 2011.2.0.1。我经常遇到的一个令人沮丧的问题是:互联网和书籍中的例子(甚至包括官方网站haskell.org上的实例-2:http://www.haskell.org/haskellwiki/State_Monad)经常不能编译。这就需要我花费不少时间去寻找问题,并发帖提问才能解决。甚至RWH书中的一些例子也无法运行。
这是由于Haskell的新版本或者haskell-platform的问题吗?语言/平台正在开发和不稳定,还是只有例子已经过时了?无论哪种情况,作为新手学习正确示例的最佳方法是什么?
更具体地说,您能否帮助修复上述提到的状态单子例子?

我知道有几本使用Hugs的Haskell书籍,它是一个稳定版本的Haskell。也许更深入地了解一下会有所帮助。祝你好运。 - wespiserA
3
@wespiserA: 咦?Hugs的最后更新是在2006年,也没有实现最新的Haskell标准。我猜它稳定是因为它从未改变过,但它也无法与基本上任何现代库一起使用。 - ehird
5
正如我之前所说的那样:在至少某些方面上,《Real World Haskell》发行的时间不太合适。它是在一些重大变化(如异常处理、mtl/transformers)之前,也在一些现在可能优于书中所使用的库的主要库之前(例如:attoparsec),而且还在一些小而有意义的改动之前(instance Monad Either已更改并移动)。这绝不是对这本书的抨击,而是赞成作者关于第二版和您有关语言变化速度的提问的看法(实施和实践方式 - 规范和核心是稳定的)。 - Thomas M. DuBuisson
1
@Rog:你可能应该为你的第二个问题提出一个单独的问题。 - Daniel Lyons
1个回答

9
在这个案例中,问题在于最新版本的Monad Transformer Library中已经删除了State构造函数。如果您将getNext定义中使用的State替换为state,那么程序就能正常工作。(这是因为State被重新定义为StateT Identity,即标识单子上的状态单子转换器,因此单独的数据类型已被删除。如果您不知道这意味着什么,不用担心;它只是意味着每当您看到State时都必须将其替换为state。)
网络或RWH中现有示例大多数问题只是由于库的新版本。 (我认为RWH示例的主要问题是Parsec示例是针对Parsec 2编写的;Parsec 3发生了相当大的变化,因此至少您可能需要添加一些导入。)
总的来说,Haskell确实存在没有足够更新和有帮助的资源的问题;那个HaskellWiki页面似乎只是未维护的。(虽然HaskellWiki确实是官方haskell.org网站,但页面是由用户编写和维护的,因此仅因为某些东西在wiki上并不一定意味着它是最新的或高质量的。)
删除了State的Monad Transformer Library发布于2010年10月,因此很遗憾,由于这个原因仍然有许多代码无法与新版本一起使用。幸运的是,修复很简单。

非常感谢,这非常有帮助。确实很遗憾2010年的代码更新仍未反映在维基百科上,而《RWH》书也已经过时了。新学生肯定需要一本新书来学习Haskell。是否还有其他的书籍/文档可用? - R71
1
我喜欢 Learn You a Haskell(尽管它的代码中仍包含State),但 RWH 也没什么问题;显然作者们正在考虑写一版新的教程。mtl 2 和 Parsec 3 是唯一的主要更改,这些更改会影响到大多数最新介绍性教程,我认为让代码同时在两者上工作的更改应该是次要的。 - ehird
1
我刚刚在维基上修复了那个特定的错误。如果你遇到问题,随时可以注册一个帐户并进行修复。 - Thomas M. DuBuisson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接