簡體   English   中英

如何運行多個Haskell IO操作並存儲結果?

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

之間的區別mapMmapM_是在的情況下mapM_ (如簽名已經建議),你是不感興趣的結果,因此不計算。 造成這種情況的原因可能是列表很長(並且是按需生成 ),因此標識符列表將永遠無法容納在內存中。

然后resultIds將包含一個標識符列表。

關於mapM (和mapM_ )函數的解釋有些過分簡化,但我認為通常最好是先對monad感到更自在,而不是完全正確地了解monadic函數的細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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