相关疑难解决方法(0)

在Haskell中创建唯一标签

我正在为Haskell中的简单命令式语言编写编译器,输出Java字节码.我已经到了我发出字节码的抽象表示的地步.

在编写用于编译if语句的代码时遇到了一些麻烦.要实现if语句,我需要跳转到标签.因此,我需要为该标签生成一个名称,该名称必须是唯一的.

我的第一个想法是通过一些状态compileStatement,即

compileStatement :: Statement -> UniqueIDState -> [AbstractInstruction]
Run Code Online (Sandbox Code Playgroud)

当然,compilerStatement是递归的,所以使用这种方法需要我从递归调用中将唯一ID生成器的状态传递回upp:

compileStatement :: Statement -> UniqueIDState -> (UniqueIdState, [AbstractInstruction])
Run Code Online (Sandbox Code Playgroud)

这看起来有点笨拙,特别是如果我意识到我需要在将来携带更多状态; 有更优雅的方式吗?

compiler-construction haskell code-generation

6
推荐指数
2
解决办法
1658
查看次数

如何在Haskell中生成不同的随机值?

假设我有一个这样的列表:

let list = ["random", "foo", "random", "bar", "random", "boo"]
Run Code Online (Sandbox Code Playgroud)

我想遍历一个列表并将所有“随机”元素映射到不同的随机字符串:

let newList = fmap randomize list
print newList
-- ["dasidias", "foo", "gasekir", "bar", "nabblip", "boo"]
Run Code Online (Sandbox Code Playgroud)

我的随机函数看起来像这样:

randomize :: String -> String
randomize str = 
  case str of
    "random" -> randStr
    _        -> str
  where
    randStr = take 10 $ randomRs ('a','z') $ unsafePerformIO newStdGen
Run Code Online (Sandbox Code Playgroud)

但是对于每个“随机”元素,我都会得到相同的随机字符串:

["abshasb", "foo", "abshasb", "bar", "abshasb", "boo"]
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样,以及如何为每次出现的“随机”获得不同的随机值。

random haskell

0
推荐指数
1
解决办法
120
查看次数