运行Literate Haskell代码时没有(GHC.Base.Alternative Parser)错误的实例

时间:2015-08-04 13:50:19

标签: haskell literate-programming

我正在尝试在Graham Hutton的Haskell编程书(http://www.cs.nott.ac.uk/~gmh/book.html)中执行示例。 尽管这些例子都是有文化的haskell,但我可以启动ghci来加载示例;例如ghci cipher.lhshttp://www.cs.nott.ac.uk/~gmh/cipher.lhs):

GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( cipher.lhs, interpreted )
Ok, modules loaded: Main.
*Main> let2int 'a'
0

但是有一些例子,由于ghci的变化,我有一些问题;例如,在第8章的Parsing.ls中,我有No instance for (Applicative ...)错误。

https://ghc.haskell.org/trac/ghc/wiki/Migration/7.10我得到一些提示,通过添加一些代码来删除一些错误。

> instance Applicative Parser where
>    pure  = return
>    (<*>) = ap  -- defined in Control.Monad
>
> instance Functor Parser where
>    fmap  = liftM
>
> instance Alternative Parser where
>     (<|>) = mplus
>     empty = mzero 

但是,我无法解决此错误消息:

Not in scope: type constructor or class ‘Alternative’

这有什么问题,以及如何解决这个问题? 导致问题的原始代码来自:http://www.cs.nott.ac.uk/~gmh/Parsing.lhs

解决方案

添加此代码可以正常工作:

import qualified Control.Applicative as CA
instance CA.Alternative Parser where ...

2 个答案:

答案 0 :(得分:5)

从您发布的analytics samples开始:

  

GHC说没有(备选方案......)的实例

     

AMP的副作用是Alternative成为超级类   MonadPlus。简单的补救措施:

     

实例Alternative Foo在哪里       (&lt; |&gt;)= mplus       空= mzero

所以这里应该是:

import Control.Applicative

instance Alternative Parser where
    (<|>) = mplus
    empty = mzero
遗憾的是,我无法确切地告诉您这是否会发生,因为您提供的图书代码链接不包含MonadPlus的实例

在哪里找到缺少的定义

最简单的方法是使用Link或hayoo - 正如您在链接中看到的那样,Hoogle会告诉您base包中的Control.Applicativeimport Control.Applicative (Alternative()) 命名空间

处理倍数

好吧我又坏了 - 你应该没事了

import qualified Control.Applicative as CA

instance CA.Alternative Parser where ...

Parsing.many

或通过限定所有内容(例如使用many而非()

再次对不起,我不能给你一个100%防水的编译解决方案 - 你可能需要测试一下(例如我对这里的import Control.Applicative (Alternative()) var model = @Html.Raw(Json.Encode(Model)); for(var i = 0; i < model.testobject.length; i++) { console.log(model.testobject[i]); } 不是100%肯定你可能脱掉它。

答案 1 :(得分:1)

我也偶然发现了这个问题。对于那些希望将模块parsing.lhs的改编版本放在导入部分中的人:

> import qualified Control.Applicative as CA

并在类型Parser定义此代码之后:

> instance Applicative Parser where
>    pure  = return
>    (<*>) = ap  -- defined in Control.Monad
> 
> instance Functor Parser where
>    fmap  = liftM
> 
> instance CA.Alternative Parser where
>    (<|>) = mplus
>    empty = mzero

或者在此处https://gist.github.com/myshov/85badeb087c51631aee3

采用模块的改编版本