【发布时间】:2020-04-08 03:06:12
【问题描述】:
我正在使用 G.Hutton 的“在 Haskell 中编程”学习 Haskell。我正在关注 Monadic Parser 的第 13 章。 首先,我定义了一个类型 Parser:
newtype Parser a = P (String -> [(a, String)])
然后,一个解析函数
parse:: Parser a -> String -> [(a, String)]
我将 Parser 设为 Monad
instance Monad Parser where
--return :: a -> Parser a
return v = P(\inp -> [(v, inp)])
--(>>=) :: Parser a -> (a -> Parser b) -> Parser b
p >>= g = P (\inp -> case parse p inp of
[] -> []
[(v, out)] -> parse (g v) out)
我的问题在 Monad 实例的最后一行 为什么会这样
[(v, out)] -> parse (g v) out)
不是这个
[(v, out)] -> (g v))
>>= 返回解析器 b,而不是 [(b, String)]。事实上,g v 是解析器。
我知道我错了,但我不明白为什么。
【问题讨论】:
-
你把它包装在一个
P构造函数中,因此它应该是String -> [(a,String)]类型。话虽如此,解析器还没有完成,因为列表可能包含多个元素。
标签: parsing haskell types functional-programming monads