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