gpt4 book ai didi

Haskell, Snap : Simple snaplet construction. 我们什么时候使用 snaplet,什么时候使用库?

转载 作者:行者123 更新时间:2023-12-04 04:26:45 24 4
gpt4 key购买 nike

我试图了解简单的 snaplet 构造。
另外,我什么时候需要制作一个 snaplet,什么时候需要一个简单的侧库?
如果我确实需要一个,我该如何从图书馆里拿出来?

例如,我有一堆 DB 函数,我在其中包装我的 SQL 代码,如下所示。

data Person = Person {personName :: ByteString, personAge :: Int}

connect :: IO Connection
connect = connectSqlite3 "/somepath/db.sqlite3"

savePerson :: Person -> IO ()
savePerson p = do
c <- connect
run c "INSERT INTO persons (name, age) \
\VALUES (?, ?)"
[toSql (personName p), toSql (personAge p)]
commit c
disconnect c

每个函数都会启动一个新连接并在提交后关闭连接。
我想制作一个 snaplet 是避免在每个功能中连接的方法?
在我的处理程序中,我会这样使用它:
insertPerson :: Handler App App ()
insertPerson = do
par <- getPostParams
let p = top par
liftIO $ savePerson p
where
top m =
Person {personName = head (m ! (B.pack "name"))
,personAge = read (B.unpack (head (m ! (B.pack "age")))) :: Int
}

到目前为止它有效。我的问题是/是:
我什么时候真的需要把一个库变成一个 snaplet?我是否需要将我的简单数据库库变成一个 snaplet 来初始化连接而不是在每个函数中建立连接?

现在,如果我制作快照...
在 Snap 网站上,有一个顶级 sanaplet 的小示例,但没有任何关于如何制作您自己的简单可插拔 snaplet 的痕迹。

所以我在我的数据库库中添加了 snaplet 初始化函数
dbInit :: SnapletInit b Connection
dbInit = makeSnaplet "DB" "My DB Snaplet" Nothing $ do
dbc <- liftIO $ connectSqlite3 "/somepath/db.sqlite3"
onUnload $ disconnect dbc
return $ dbc

这是正确的做法吗?这就是我需要把它变成一个可插拔的 snaplet 的全部吗?

然后我将这个 DB snaplet 堆叠到主应用程序中
data App = App
{ _heist :: Snaplet (Heist App),
_dbcon :: Snaplet (Connection)
}

makeLens ''App

app :: SnapletInit App App
app = makeSnaplet "app" "My app" Nothing $ do
h <- nestSnaplet "heist" heist $ heistInit "templates"
d <- nestSnaplet "" dbcon dbInit
addRoutes routes
return $ App h d

现在,我获得的只是请求处理程序可用的连接,对吧?
所以我的处理程序变成:
insertPerson :: Handler App App ()
insertPerson = do
par <- getPostParams
let person = top par
connection <- gets _dbcon
liftIO $ savePerson connection person
where
top m =
Person {personName = head (m ! (B.pack "name"))
,personAge = read (B.unpack (head (m ! (B.pack "age")))) :: Int
}

这似乎不起作用。我究竟做错了什么?这是从 snaplet 句柄 (dbcon) 中提取连接的正确方法吗?这通常是构建简单 snaplet 的正确方向吗?在我的情况下,我真的需要一个 snaplet 吗?

谢谢。

最佳答案

HandlerMonadState 的一个实例: MonadState v (Handler b v) .
Handler也是 MonadSnaplet 的一个实例因此提供了with方法:with :: Lens v (Snaplet v') -> m b v' a -> m b v adbconLens App (Snaplet Connection) .

所以去Connection我们可以用:conn <- with dbcon get
如果您提供每个人都可能受益的功能,您通常会创建一个 snaplet。在您的情况下,最好利用 HDBC snaplet ,您可以使用它来连接到 sqlite3 数据库。

结帐http://norm2782.github.com/snaplet-hdbc.html有关使用 HDBC snaplet 的好教程。

关于Haskell, Snap : Simple snaplet construction. 我们什么时候使用 snaplet,什么时候使用库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9936322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com