>> =返回......这里发生了什么?

the*_*ets 7 haskell

我正在读一篇关于exercism.io的提交,其中有人建议

concat (replicate n str)
Run Code Online (Sandbox Code Playgroud)

也可以表示为:

[1..n] >>= return str
Run Code Online (Sandbox Code Playgroud)

没有进入随后关于这个主题的所有辩论:我正在寻找一个完整的外行人解释为什么/如何运作的解释.

特别是,在我试图重塑这一点后,我认为它可能有点类似于:

fmap (return char) [1..3]
Run Code Online (Sandbox Code Playgroud)

但我不理解的是为什么

[1..n] >>= return 'M'
Run Code Online (Sandbox Code Playgroud)

是一个错误,在哪里

[1..n] >>= return "M"
Run Code Online (Sandbox Code Playgroud)

很好.

任何真正在Haskell中找到线索的人都能告诉我这一切是如何运作的吗?

sha*_*ang 14

[1..n] >>= return str
Run Code Online (Sandbox Code Playgroud)

return是从函数monad((->) a)所以上面相当于

[1..n] >>= const str
Run Code Online (Sandbox Code Playgroud)

其中const是一个忽略其参数并始终返回的函数,str并且>>=是列表monad的绑定运算符,这与concatMap我们得到的相同

concatMap (const str) [1..n]
Run Code Online (Sandbox Code Playgroud)

它基本上用每个列表元素替换str,然后连接它们.

至于为什么[1..n] >>= return 'M'是一个错误:它减少到concatMap (const 'M') [1..n]但参数concatMap必须返回一个列表而'M'不是一个列表,而"M"(相当于['M'])是.

  • +1注意到`return`来自函数monad! (3认同)