假设我正在设计一个跟踪其内部状态的库,并且我想允许用户添加自己的自定义状态。用户希望为此目的拥有什么样的界面?
更准确地说,这个问题主要是关于将独立状态添加到现有状态,以便状态的范围(或生命周期(保持不变。
Parsec是一个非常有名的库,它使用用户状态 你在问题中提到的。看看它可能会有所帮助 确实如此。我正在使用此文档。
Hoogle对ParsecT单体变压器的类型有什么看法?
ParsecT s u m a 是一个流类型为 s、用户状态类型 u、 底层单子 M 和返回类型 A。
Parsec在用户状态下是严格的。
如果不希望这样做,只需使用数据类型,例如数据框 a = 框 a 和状态类型 Box YourStateType 以添加间接级别。
接下来,让我们看看模块的作者如何允许用户操作 用户状态。 我们可以使用以下函数读取此状态:
getState :: Monad m => ParsecT s u m u
可以使用以下函数编写状态:
putState :: Monad m => u -> ParsecT s u m ()
可以使用此函数转换状态:
modifyState :: Monad m => (u -> u) -> ParsecT s u m ()
最后,我们看一下传递初始用户状态的方式 到类型ParsecT s u m a
的函数:
runParser :: Stream s Identity t =>
Parsec s u a -> u -> SourceName -> s ->
Either ParseError a
我还没有看到关于Parsec使用的界面的抱怨 对于用户状态,所以上面的函数应该是一个很好的第一步 用于图书馆的设计。