[英]Haskell Snap: Executing an IO action within a handler?
說,我在單獨的DB.hs文件中有一個隨機DB函數。 像這樣:
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
return ()
現在,如果導入DB.hs,如何在Site.hs的處理程序中執行此功能?
如果我只是像這樣將其粘貼在我的處理程序中(這只是一個示例):
insertPerson = do
par <- getPostParams
let p = toPerson par
savePerson p
return ()
where
toPerson m =
Person {personName = head (m ! (B.pack "name"))
,personAge = read (B.unpack (head (m ! (B.pack "age")))) :: Int
}
這是行不通的。 我不希望處理程序返回任何東西,我只希望它保存Person而不返回/呈現任何東西。
正確的做法是什么?
謝謝。
您的問題似乎是您不了解單位類型和值的含義。
單元類型是一種特殊的內置類型,稱為“()”,它只有一個值,也稱為“()”。
因此,例如,我可以創建一個包含4個單位的列表,其類型為“單位列表”。
fourUnits :: [()]
fourUnits = [(), (), (), ()]
單位類型用於不需要其他信息的地方。 因此,從技術上講,類型“ IO()”是給出單位值的IO操作的類型。
“ do”子句不包含“ >> =“調用鏈。 “ >> =”具有類型
(>>=) :: (Monad m) => m a -> (a -> m b) -> m b
換句話說,“ do”子句的類型是其最后一個操作返回的類型。
所以你在哪里說
savePerson p
return ()
“ return()”是虛假的,因為它的類型與“ savePerson p”完全相同。
請記住,“返回”與控制流無關:它只是具有類型的函數
return :: (Monad m) => a -> m a
最好將其稱為“包裝”或“注入”或類似的名稱以避免這種混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.