ReservedOp,st()的用法

时间:2014-05-24 18:03:47

标签: haskell

我想为一些数学表达式创建一个Haskell解析器。为此,我想使用reservedOp来定义运算符。我试图找到一些信息,我找到了这个例子:

reservedOp :: String -> CharParser st ()
reservedOp = PT.reservedOp lexer 

我在google上搜索,甚至在hoogle上搜索:)但是找不到st ()的任何解释。任何人都可以用几句话解释我与它有什么关系吗?

2 个答案:

答案 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以了解它的全部内容。