在Haskell中多次使用一个随机变量

时间:2011-01-13 10:12:39

标签: haskell random lazy-evaluation

它想制作一个随机序列的开括号和匹配的闭括号序列。这是我的(部分)代码:

shuffle :: [a] -> IO [a]
ps xs ys = map snd . sort $ zip xs ys

opens  = "[{("
closes = "]})"

parens = do
ord <- shuffle [0..length opens]
  let os  = ps ord opens
      cs  = reverse $ ps ord closes

它不起作用,因为它为每个shuffle生成一个新的ord。如何让它记住ord并将其用于两个shuffle?

2 个答案:

答案 0 :(得分:0)

不要单独洗牌。

随机播放zip ped序列和unzip

答案 1 :(得分:0)

您是否见过Oleg的Provably perfect shuffle algorithmsSystem.Random.Shuffle实施?

重新阅读(非常不完整的)代码后,似乎可能正确,对周围代码做出一些假设。请显示更多,以便我们确定可能出现的问题。

顺便说一句,使用map fst . sortBy (comparing `on` fst) . zip xsmap fst . sortWith fst . zip xs会更清楚地表明您的意图是按顺序排列一个列表。