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