【发布时间】:2013-08-15 17:48:06
【问题描述】:
为了好玩,我正在构建一个解析器库。在这个库中,我有一个 Parser 数据类型:
data Parser e a = Parser (String -> Either e (a, String))
我能够定义Parser 的Functor 和Applicative 实例,但我认为我不能在不限制“错误”类型或“值”类型的情况下创建Alternative 实例解析器可以返回。最初,当错误类型为 String 消息时,这使我创建了一个 Applicative 实例,但我意识到我应该能够将此约束释放到具有 Alternative 的任何消息数据类型(或者可能是 @987654330 @ 而不是?)实例也是如此。考虑到这一点,我写了这个:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
instance Alternative e => Alternative (Parser e)
where
empty = Parser $ \s -> Left empty
(<|>) (Parser p1) (Parser p2) = Parser $ \s -> tryParser s p2 $ p1 s
where
tryParser s p2 (Left _ ) = p2 s
tryParser _ _ x = x
很遗憾,编译失败。当我将它加载到 ghci 中时,我收到以下错误消息:
Parsertest.hs:31:47:
Expecting one more argument to `e'
In the instance declaration for `Alternative (Parser e)'
Failed, modules loaded: none.
当我在网上搜索时,这似乎是解决方案,但它对我不起作用。我错过了什么?
【问题讨论】: