簡體   English   中英

Haskell Snap:在處理程序中執行IO操作嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM