我正在读一篇关于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'])是.