【问题标题】:No instance for (GHC.Base.Alternative Parser) error running Literate Haskell code没有运行 Literate Haskell 代码的 (GHC.Base.Alternative Parser) 错误实例
【发布时间】:2015-08-04 13:50:18
【问题描述】:

我正在尝试执行 Graham Hutton 的 Programming in Haskell 书 (http://www.cs.nott.ac.uk/~gmh/book.html) 中的示例。 即使这些示例是在 literate 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 ...

【问题讨论】:

  • 很高兴我们终于可以一起解决这个问题 - 恭喜

标签: haskell literate-programming


【解决方案1】:

来自您发布的Link

GHC 说没有 (Alternative ...) 的实例

AMP 的一个副作用是 Alternative 成为了 单子加。简单的补救措施:

instance Alternative Foo where () = mplus 空 = mzero

所以这里应该是:

import Control.Applicative

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

遗憾的是,我无法确切告诉您是否会这样做,因为您提供的书籍代码的链接不包括 MonadPlus 的实例

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

最简单的方法是使用 hoogle 或 hayoo - 正如您在链接中看到的,例如 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()),您可能可以剥离它。

【讨论】:

  • 如果您查看我的原始帖子,您会发现我添加了Alternative Parser。我更新了链接以显示包含 MonadPlus 的代码和我现在拥有的错误消息。
  • @prosseek 好吧抱歉 - 一个简单的 import Control.Applicative 应该可以解决问题
  • 请注意,这些定义本身对我没有多大帮助(我有点想要我自己可以加载到 ghci 中的代码)——是的,我基本上知道如何实现 Parser 和所有东西——但我我懒得这样做,或者只是自己从书中复制。但是你真的应该尝试自己处理这些小烦恼 - 你迟早必须这样做,并且在最后一种情况下的编译器错误并不难理解 IMO
  • PS:也请不要编辑我的答案这么多 - 如果你对它不满意,请添加你自己的并接受它(你可以这样做 - 我认为你只需要稍等一下)
  • 好吧,我只是让问题和答案尽可能简单;我将更新我的问题以显示正确的方法。谢谢你的帮助。
【解决方案2】:

我也偶然发现了这个问题。对于那些想要模块 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

【讨论】:

  • 对于那些投反对票的人。我回答这个问题的动机不是进行某种重复,而是为那些只想为新版本 GHCI 获取模块的改编版本的人准备好解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2021-06-17
相关资源
最近更新 更多