繁体   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