为了好玩,我正在构建一个解析器库。在这个库中,我有一个Parser
数据类型:
data Parser e a = Parser (String -> Either e (a, String))
我可以定义Functor
和Applicative
的实例Parser
,但我认为我不能在Alternative
不限制解析器可以返回的“错误”类型或“值”类型的情况下创建实例。最初,这使我Applicative
为错误类型是String
消息时创建了一个实例,但我意识到我应该能够将此约束释放到任何具有Alternative
(或者可能Monoid
是?)实例的消息数据类型。考虑到这一点,我写了这个:
{-# 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.
当我在网上搜索时,这似乎是解决方案,但它对我不起作用。我错过了什么?