我想为一些数学表达式创建一个Haskell解析器。为此,我想使用reservedOp来定义运算符。我试图找到一些信息,我找到了这个例子:
reservedOp :: String -> CharParser st ()
reservedOp = PT.reservedOp lexer
我在google上搜索,甚至在hoogle上搜索:)但是找不到st ()
的任何解释。任何人都可以用几句话解释我与它有什么关系吗?
答案 0 :(得分:4)
CharParser
只是一种类型的同义词。用于解析ParsecT
的主解析器类型具有许多类型变量和许多通常未使用的功能。完整类型是
newtype ParsecT s u m a = ...
s
是解析器状态,u
是用户状态,m
是底层monad,a
是返回值。
如果这些都没有意义,那么您应该阅读monad transformers。
但这对理解CharParser
可能并不重要。您可以按照类型同义词
>:i CharParser
type CharParser st = GenParser Char st
>:i GenParser
type GenParser tok st = Parsec [tok] st
>:i GenParser
type GenParser tok st = Parsec [tok] st
>:i Parsec
type Parsec s u = ParsecT s u Identity
发现CharParser st ()
只是ParsecT [Char] st Identity ()
。这是一个解析器,它在Char
(又名String
)的流上运行,其用户状态为任何,并且不返回任何内容。用户状态可以是任何事物的唯一方式是,任何人都不会使用它。所以它几乎没有任何意义,你可以写任何
reservedOp :: String -> CharParser () ()
reservedOp :: String -> CharParser Int ()
reservedOp :: String -> CharParser Bool ()
等。如果用户状态未被使用,则习惯于写CharParser () ()
来表示(有些人会说这是错误的,并且CharParser Void ()
data Void
是无人居住的类型,但是只是迂腐)。事实上,链接中的作者在大多数类型签名中都是这样做的(即factor :: CharParser () Double
)
答案 1 :(得分:1)
由于st
是小写的,它只是一个(类型)变量名。查看CharParser
以了解它的全部内容。