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