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)
但我仍然不明白它是如何工作的。谁能解释这种行为?
>>=for 列表的定义是concatMap:对列表的每个元素应用一个函数,然后连接结果。当您使用 时,这意味着应用一个忽略>>列表中每个元素的函数,而是返回右侧的常量值>>
[1..3] >> "a" == [1..3] >>= \_ -> "a"
== concatMap (\_ -> "a") [1..3]
== "a" ++ "a" ++ "a"
== "aaa"
Run Code Online (Sandbox Code Playgroud)