我正在尝试在 Haskell 中实现一个回合制游戏的服务器。我的选择是使用 Yesod 进行管理和元信息(例如,用户参与哪些游戏等)。
我想使用网络套接字来保持游戏内数据开销较小。
查看 ws-chat 示例,我不确定如何访问 Handler Monad 及其持久性。
如果有一些用于连接的簿记代码包裹在“普通”处理程序中,该处理程序本身会更新数据库并通知相关用户,那将是完美的。
最佳答案
我认为它应该是这样的。
{-# LANGUAGE QuasiQuotes, TypeFamilies, GeneralizedNewtypeDeriving, TemplateHaskell, OverloadedStrings, GADTs, FlexibleContexts #-}
module Main where
import Control.Monad.IO.Class (liftIO)
import Data.String (fromString)
import Database.Persist
import Database.Persist.TH
import Database.Persist.Sqlite
import Network.Wai.Application.Static (staticApp, defaultWebAppSettings, defaultFileServerSettings)
import Network.Wai.Handler.Warp (runSettings, defaultSettings, settingsIntercept, settingsPort)
import Network.Wai.Handler.WebSockets (intercept)
import qualified Network.WebSockets as WS
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistUpperCase|
Person
name String
age Int
deriving Show
|]
ws :: WS.Request -> WS.WebSockets WS.Hybi10 ()
ws r = do
WS.acceptRequest r
liftIO $ runSqlite ":memory:" $ do
runMigration migrateAll
michaelId <- insert $ Person "Michael" 26
michael <- get michaelId
liftIO $ print michael
main :: IO ()
main = runSettings defaultSettings
{ settingsPort = 9160
, settingsIntercept = intercept $ ws
} $ staticApp (defaultFileServerSettings $ fromString ".")
关于haskell - Yesod、WebSockets 和持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15031607/