背景:
我正在做一个代码翻译项目,需要我生成变量名。我生成的名字都不应该是重复的。
我真的很沮丧,因为使用 Python 生成器函数会非常简单和优雅。
我试过的:
我之前这样做的方式是通过递归调用我的翻译代码向下传递一个计数器变量,并在基本上每个函数的返回值中传递(可能递增的)计数器。
这真的很混乱:它添加了一个额外的参数来跟踪每个函数;更糟糕的是,它迫使我使用凌乱的元组返回值,否则我会得到一个简单的一元返回值。
在我使用 Haskell 的短时间内,我从来没有真正精通过 monad,但我有一种想法,我可以在State
monad 上使用包装器来模拟全局计数器变量。在尝试 grok monad 并制作自己的 monad 3 天后,尝试改变其他人的 monad 以生成我需要的值,我终于让自己直接使用其他人的高级 monad(也许有一些改动。)
我现在的问题:
我已将MonadSupply和MonadUnique模块确定为可能提供我需要的简单接口的一对。不幸的是,我不知道如何使用它们。
特别是MonadSupply
模块文档提供了这个很好的示例用例:
runSupplyVars x = runSupply x vars
where vars = [replicate k ['a'..'z'] | k <- [1..]] >>= sequence
看起来像我想要的!一旦我得到了要编译的模块,我在解释器中检查了这个函数的类型:
> :t runSupplyVars
runSupplyVars :: Supply [Char] a -> Identity (a, [[Char]])
我尝试将很多(价值数小时)不同的东西传递给这个函数,但没有成功。我还尝试将函数传递给其他各种函数,以查看它们是否会隐式提供我需要的参数。到目前为止没有运气。
问题:
runSupplyVars
有人可以提供此功能的示例用例吗?
有可能用它做我想做的事吗?我想要一个可以从程序中的任何位置调用的函数,它会在每次调用时为我提供不同的变量名或整数。