Haskell 是否为每个请求获取新的StdGen?

Haskell 是否为每个请求获取新的StdGen?,haskell,random,monad-transformers,happstack,Haskell,Random,Monad Transformers,Happstack,我有一个简单的Happstack应用程序,它显示了一个带有电子邮件字段和随机问题字段的表单,以帮助打击垃圾邮件。为了获得一个随机数,我在我的main函数中使用getStdGen,并将其传递给创建html的函数。问题是使用了相同的StdGen,因此我的随机值不是随机值,除非我重新启动应用程序 下面是myMain.hs的外观: {-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}

我有一个简单的Happstack应用程序,它显示了一个带有电子邮件字段和随机问题字段的表单,以帮助打击垃圾邮件。为了获得一个随机数,我在我的
main
函数中使用
getStdGen
,并将其传递给创建html的函数。问题是使用了相同的
StdGen
,因此我的随机值不是随机值,除非我重新启动应用程序

下面是my
Main.hs
的外观:

{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}                                                                                                

module Main where                                                                                                                                      

import Happstack.Lite                                                                                                                                  
import qualified Pages.Contact as Contact                                                                                                                                                                                                                                
import System.Random                                                                                                                                   

main :: IO ()                                                                                                                                          
main = do                                                                                                                                              
    gen <- getStdGen                                                                                                                                   
    serve Nothing $ pages gen                                                                                                                          

pages :: StdGen -> ServerPart Response                                                                                                                 
pages g = msum                                                                                                                                         
    [ dir "contact" $ Contact.page g                                                                                                                   
    ... Other irrelevant pages                                                                                                           
    ]

解决这个问题最优雅的方法是什么?

在我写这个问题的时候,我找到了一个解决方案

在返回类型为
ServerPart Response
的路由中,可以使用
liftIO
monad转换器执行IO操作。有一个名为
randomRIO
的简便函数,它通过一个元组的输入生成一个随机
Int
,其中两个
Int
s作为范围,如下所示:

page :: ServerPart Response
page = do 
    randID <- liftIO $ randomRIO (0, max)
    ... Code to generate response ...
    where max = length questions
page::服务器部分响应
page=do

randID当我写下这个问题时,我找到了一个解决方案,这个解决方案在

在返回类型为
ServerPart Response
的路由中,可以使用
liftIO
monad转换器执行IO操作。有一个名为
randomRIO
的简便函数,它通过一个元组的输入生成一个随机
Int
,其中两个
Int
s作为范围,如下所示:

page :: ServerPart Response
page = do 
    randID <- liftIO $ randomRIO (0, max)
    ... Code to generate response ...
    where max = length questions
page::服务器部分响应
page=do
兰迪德