是否有一种通用模式允许在 Haskell 中扩展现有状态?



假设我正在设计一个跟踪其内部状态的库,并且我想允许用户添加自己的自定义状态。用户希望为此目的拥有什么样的界面?

更准确地说,这个问题主要是关于将独立状态添加到现有状态,以便状态的范围(或生命周期(保持不变。

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使用的界面的抱怨 对于用户状态,所以上面的函数应该是一个很好的第一步 用于图书馆的设计。

最新更新