为什么 >> 在 haskell 中重复右侧操作数

S4e*_*3sm 2 monads haskell do-notation

我正在寻找重复字符串n时间的解决方案。我duplicate n str = [1..n] >> str从这个解决方案中找到了。我想知道为什么这个方法会重复str.

我搜索了一下>>,发现了这一点:

k >> f = k >>= \_ -> f
Run Code Online (Sandbox Code Playgroud)

a >> b >> c >> d
-- is is equivalent to
do a
   b
   c
   d
Run Code Online (Sandbox Code Playgroud)

然后我试试这个

ghci> do [1..3]; "a"
"aaa"
Run Code Online (Sandbox Code Playgroud)

但我仍然不明白它是如何工作的。谁能解释这种行为?

che*_*ner 7

>>=for 列表的定义是concatMap:对列表的每个元素应用一个函数,然后连接结果。当您使用 时,这意味着应用一个忽略>>列表中每个元素的函数,而是返回右侧的常量值>>

[1..3] >> "a" == [1..3] >>= \_ -> "a"
              == concatMap (\_ -> "a") [1..3]
              == "a" ++ "a" ++ "a"
              == "aaa"
Run Code Online (Sandbox Code Playgroud)

  • 好吧,如果你想有效地使用列表 monad,你应该重点了解 `(>>=)` 如何在列表上工作。 (2认同)