簡體   English   中英

append Haskell 中的兩個單子列表有什么辦法嗎?

[英]Any way to append two monadic lists in Haskell?

我這學期在 Uni 學習 Haskell。 我遇到了一個問題,我的列表列表為IO [[String]] ,我想將 append 和IO [String]添加到第一個。

讓我們將它們表示為 x 和 y。 所以我嘗試做y >>= return. (++) [x] y >>= return. (++) [x]y <> [x] 他們都給出了錯誤: Could not match IO [[String]] with [IO [String]]. 有什么建議么? 謝謝你。

在我看來,要學習的最簡單的通用技術就是如何使用do塊。

test :: IO [[String]]
test = do
   xss <- generateListOfLists  -- IO [[String]]
   xs  <- generateList         -- IO [String]
   return (xss ++ [xs])

這個想法是<-暫時解開 monad,從類型中刪除IO monad,只要在最后我們在同一個 monad 中返回一個值(最后return )。

在理解了這種通用技術之后,就可以學習替代方法,例如應用符號,它不是那么通用,但仍然很好。

test :: IO [[String]]
test =
   (\xss xs -> xss ++ [xs])
   <$> generateListOfLists
   <*> generateList

使用>>=不太常見,至少在這種情況下不如do塊方便。

test :: IO [[String]]
test = 
   generateListOfLists >>= \xss ->
   generateList >>= \xs ->
   return (xss ++ [xs])

暫無
暫無

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

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