代码如下:
type Parser a = String -> [(a, String)] retrn :: a -> Parser a retrn v = \inp -> [(v, inp)] parse :: Parser a -> String -> [(a, String)] parse p inp = p inp item :: Parser Char item = \inp -> case inp of [] -> [] (x:xs) -> [(x, xs)] --problem code p :: Parser (Char, Char) p = do x <- item item y <- item retrn (x, y)
它给出以下类型错误:
SO-34035520.hs:19:8: Couldn't match type `[(Char, String)]' with `Char' Expected type: String -> [((Char, Char), String)] Actual type: Parser ([(Char, String)], [(Char, String)]) In a stmt of a 'do' block: retrn (x, y) In the expression: do { x <- item; item; y <- item; retrn (x, y) }
值得注意的是,本书官方网站上的示例代码可以顺利解释,即*.lhs格式.
那么,有人可以告诉我为什么吗?几天来我一直在努力奋斗.
提前致谢.
(->) String
有一个Monad实例,但它不是你想要的.do
在定义中使用-notation时p
,此实例是拾取的实例.
你想要做的是创建自己的Monad
实例Parser
(这需要将它从类型同义词更改为newtype
包装器String -> [(a, String)]
),然后在定义中选择它p
.
请注意,您的示例代码已经具有return
(在其名称下retrn
)执行正确的实现,并且它与return
for (->) String
(它将是)的实现非常不同retrn v = \inp -> v
.