haskell - Yesod、WebSockets 和持久性

标签 haskell websocket yesod

我正在尝试在 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/

相关文章:

user-interface - OSX 上的 Haskell GUI 库

haskell - 如何使这个算法更加懒惰而不重复自己?

list - 编辑列表中的每个第 N 个项目

html - 什么更好 : WebSocket-Node or ws? nodejs websockets 是否有标准接口(interface)?

java - jWebsocket 大量停放线程(等待)

haskell - Yesod 中模板 haskell 的评估

haskell - Yesod数据库持久记录访问

parsing - 如何为相互递归的 ADT 编写一个解析器,而不产生递归和副作用?

ubuntu - Django Channels 服务器配置 : Ubuntu. 404 握手

yesod - 解析 JSON 帖子