我有一个简单的小 Happstack 应用程序,它显示了一个带有电子邮件字段和随机问题字段的表单,以帮助打击垃圾邮件。要获取我在函数中使用的随机数getStdGen
并将main
其传递给创建 html 的函数。问题是StdGen
使用相同的,所以我的随机值不是随机的,除非我重新启动应用程序。
这是我的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
]
StdGen
下面是使用检索随机问题 id的函数:
getRandomQID :: StdGen -> Int
getRandomQID g =
let (rpercent, _) = random g :: (Float, StdGen)
rid = rpercent * questionsAmount
in round rid
questionsAmount :: (Num a) => a
questionsAmount = (fromIntegral . length) questions
解决这个问题的最优雅的方法是什么?