[英]How can I run multiple Haskell IO actions and store the results?
我是Haskell的初學者,所以對於新手問題,請提前表示抱歉。 我對單子只有一個非常膚淺的理解。
我正在使用Persistent模塊中的功能insert
。 (我在這里一直在關注本教程 。)它在數據庫中插入一些內容,並返回ID。 我可以這樣使用它:
resultId <- insert myItem
對於單個項目來說效果很好。 我可以這樣打印出resultId:
liftIO $ print resultId
但是,如果myItem
實際上是任意長度的列表怎么辦? 我想在此列表上映射insert
,這似乎可以做到:
resultIds <- mapM_ insert myItemList
但是如果我嘗試打印出這些值:
liftIO $ print resultIds
我剛得到()
。 我究竟做錯了什么?
您非常接近:您需要mapM :: Monad m => (a -> mb) -> ta -> m (tb)
mapM_ :: (Foldable t, Monad m) => (a -> mb) -> ta -> m ()
mapM :: Monad m => (a -> mb) -> ta -> m (tb)
代替mapM_ :: (Foldable t, Monad m) => (a -> mb) -> ta -> m ()
就像已經暗示的名稱和簽名一樣,這兩個函數都帶有一個monadic函數和a
s的可遍歷(現在讓我們假定它是一個列表),並將monadic函數應用於所有元素並返回包含以下內容的monadic函數:結果的可遍歷(列表)。
因此,如果您寫:
resultIds <- mapM insert myItemList
之間的區別mapM
和mapM_
是在的情況下mapM_
(如簽名已經建議),你是不感興趣的結果,因此不計算。 造成這種情況的原因可能是列表很長(並且是按需生成的 ),因此標識符列表將永遠無法容納在內存中。
然后resultIds
將包含一個標識符列表。
關於mapM
(和mapM_
)函數的解釋有些過分簡化,但我認為通常最好是先對monad感到更自在,而不是完全正確地了解monadic函數的細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.