有什么方法可以在 Haskell 中附加两个单子列表吗?

Any way to append two monadic lists in Haskell?

提问人:tugudd 提问时间:12/4/2022 更新时间:12/4/2022 访问量:119

问:

这学期我在大学学习Haskell。我遇到了一个问题,我有一个列表列表,我想在第一个列表上附加一个。IO [[String]]IO [String]

让我们将它们表示为 x 和 y。所以我试着做或。他们都给出了错误:有什么建议吗?谢谢。y >>= return . (++) [x] y <> [x]Could not match IO [[String]] with [IO [String]].

字符串 列表 haskell io monads

评论


答:

2赞 chi 12/4/2022 #1

在我看来,最简单的通用技术是关于如何使用块。do

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

这个想法是暂时解开单子,从类型中删除单子,只要在最后我们返回同一个单子中的值(在末尾)。<-IOreturn

在理解了一般技术之后,就可以学习应用符号等替代方案,这不那么通用,但仍然很好。

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
谢谢,我会在我的代码中尝试这个。我们的讲师不希望我们使用块,因为他认为它不是纯粹的“功能”。正因为如此,我对块的使用并不完全熟悉。dodo
0赞 chi 12/5/2022
@tugudd 符号和符号之间没有显着区别。您可以将它们中的任何一个转换为另一个。它只是同一事物的不同语法。如果一个“不是纯粹的功能”,那么另一个也是如此。do x<- ...... >>= \x ->