我正在观看函数式编程基础知识Erik Meijer 的系列讲座(幻灯片由 Graham Hutton 制作)。
In 第 8 课(关于函数解析器) https://www.youtube.com/watch?v=OrAVS4QbMqo,定义后Parser a https://www.youtube.com/watch?v=OrAVS4QbMqo#t=15m44s类型,引入一些解析原语(包括item https://www.youtube.com/watch?v=OrAVS4QbMqo#t=16m35s and return https://www.youtube.com/watch?v=OrAVS4QbMqo#t=20m30s,我将其命名为return'
),埃里克给出简单的例子 https://www.youtube.com/watch?v=OrAVS4QbMqo#t=31m35s说明如何使用 do 语法将他的解析器组合成一个序列:
type Parser a = String -> [(a,String)]
item :: Parser Char
item = \inp -> case inp of
[] -> []
(x:xs) -> [(x,xs)]
return' :: a -> Parser a
return' v = \inp -> [(v,inp)]
p :: Parser (Char,Char)
p = do x <- item
item
y <- item
return' (x,y)
然而,当我尝试在 GHCi 中加载它时,出现以下类型错误,这是我没有预料到的,也不理解:
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: return' (x, y)
In the expression:
do { x <- item;
item;
y <- item;
return' (x, y) }
Failed, modules loaded: none.
我究竟做错了什么?