提问人:tugudd 提问时间:12/4/2022 更新时间:12/4/2022 访问量:119
有什么方法可以在 Haskell 中附加两个单子列表吗?
Any way to append two monadic lists in Haskell?
问:
这学期我在大学学习Haskell。我遇到了一个问题,我有一个列表列表,我想在第一个列表上附加一个。IO [[String]]
IO [String]
让我们将它们表示为 x 和 y。所以我试着做或。他们都给出了错误:有什么建议吗?谢谢。y >>= return . (++) [x]
y <> [x]
Could not match IO [[String]] with [IO [String]].
答:
2赞
chi
12/4/2022
#1
在我看来,最简单的通用技术是关于如何使用块。do
test :: IO [[String]]
test = do
xss <- generateListOfLists -- IO [[String]]
xs <- generateList -- IO [String]
return (xss ++ [xs])
这个想法是暂时解开单子,从类型中删除单子,只要在最后我们返回同一个单子中的值(在末尾)。<-
IO
return
在理解了一般技术之后,就可以学习应用符号等替代方案,这不那么通用,但仍然很好。
test :: IO [[String]]
test =
(\xss xs -> xss ++ [xs])
<$> generateListOfLists
<*> generateList
使用不太常见,至少在这种情况下,不如块方便。>>=
do
test :: IO [[String]]
test =
generateListOfLists >>= \xss ->
generateList >>= \xs ->
return (xss ++ [xs])
评论
0赞
tugudd
12/4/2022
谢谢,我会在我的代码中尝试这个。我们的讲师不希望我们使用块,因为他认为它不是纯粹的“功能”。正因为如此,我对块的使用并不完全熟悉。do
do
0赞
chi
12/5/2022
@tugudd 符号和符号之间没有显着区别。您可以将它们中的任何一个转换为另一个。它只是同一事物的不同语法。如果一个“不是纯粹的功能”,那么另一个也是如此。do x<- ...
... >>= \x ->
评论