【发布时间】:2026-02-16 10:20:06
【问题描述】:
我目前正在努力学习和理解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
我还没有完全理解的是类型参数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 根本没有使用。我的问题是为什么这个定义是“错误的”以及它会带来什么问题......
【问题讨论】:
标签: haskell attoparsec