没有实例 (GHC.Base.Alternative 解析器) 错误 运行 识字 Haskell 代码

No instance for (GHC.Base.Alternative Parser) error running Literate Haskell code

我正在尝试执行 Graham Hutton 在 Haskell 书中的编程 (http://www.cs.nott.ac.uk/~gmh/book.html) 中的示例。 即使示例是文字 haskell,我也可以启动 ghci 来加载示例;例如 ghci cipher.lhs (http://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 ...

就在您发布的 Link 中:

GHC says No instance for (Alternative ...)

A side-effect of the AMP is that Alternative became a super-class of MonadPlus. The easy remedy:

instance Alternative Foo where (<|>) = mplus empty = mzero

所以这里应该是:

import Control.Applicative

instance Alternative Parser where
    (<|>) = mplus
    empty = mzero

遗憾的是,我无法准确告诉您这是否可行,因为您提供的书籍代码的 links 不包含 MonadPlus

的实例

在哪里可以找到缺失的定义

最简单的方法是使用 hoogle 或 hayoo - 正如您在 link 中看到的那样 Hoogle 例如会告诉您它在 base 包中并且Control.Applicative 命名空间

处理倍数

好吧,我又说错了 - 你应该没问题

import Control.Applicative (Alternative())

import qualified Control.Applicative as CA

instance CA.Alternative Parser where ...

或者通过限定所有的东西(比如使用 Parsing.many 而不仅仅是 many

再次抱歉,我不能给你一个 100% 防水的编译解决方案 - 你可能需要测试一下(例如我不是 100% 确定 () 这里 import Control.Applicative (Alternative()) 和你大概可以剥离它。

我也偶然发现了这个问题。对于那些想要模块 parsing.lhs 的改编版本的人,只需将其放在导入部分:

> import qualified Control.Applicative as CA

在类型解析器定义之后,此代码:

> 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