我目前正在努力研究和理解该attoparsec
库的源代码,但有些细节我自己无法弄清楚。例如Parser
类型的定义:
newtype Parser i a = Parser {
runParser :: forall r.
State i -> Pos -> More
-> Failure i (State i) r
-> Success i (State i) a r
-> IResult i r
}
newtype Pos = Pos { fromPos :: Int }
deriving (Eq, Ord, Show, Num)
data IResult i r =
Fail i [String] String
| Partial (i -> IResult i r)
| Done i r
type Failure i t r = t -> Pos -> More -> [String] -> String
-> IResult i r
type Success i t a r = t -> Pos -> More -> a -> IResult i r
我还不完全理解的是 type-parameter 的用法r
。如果我定义这样的类型签名会有什么不同runParser
:
State i -> Pos -> More -> Failure i (State i) a -> Success i (State i) a a -> IResult i a
?
您能帮我理解forall r.
在这种情况下的确切含义以及为什么有必要在runParser
的类型签名中使用它吗?
提前谢谢!
更新:进一步澄清我的问题:我目前不明白为什么有必要首先引入类型参数r
。可以想象,该Parser
类型也可以这样定义:
newtype Parser i a = Parser {
runParser ::
State i -> Pos -> More
-> Failure i (State i) a
-> Success i (State i) a
-> IResult i a
}
data IResult i a =
Fail i [String] String
| Partial (i -> IResult i a)
| Done i a
type Failure i t a = t -> Pos -> More -> [String] -> String
-> IResult i a
type Success i t a = t -> Pos -> More -> a -> IResult i a
r
其中根本不使用类型参数。我的问题是为什么这个定义是“错误的”以及它会带来什么问题......