没有实例 (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
我正在尝试执行 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