我正在阅读有关列表单子的内容并遇到:
[1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch)
它产生
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
我是这样理解的:
隐式括号是:
([1,2] >>= \n -> ['a','b']) >>= (\ch -> return (n,ch))
([1,2] >>= \n -> ['a','b'])
应该给[('a',1),('b',1),('a',2),('b',2)]
because
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs) -- this line
fail _ = []
so concat (map f xs)
is concat (map (\n -> ['a','b']) [1,2])
应该产生[('a',1),('b',1),('a',2),('b',2)]
- 与实际输出完全相反。
然后我就不懂了>>= (\ch -> return (n,ch))
部分 - 我认为n
这里没有意义。这个特定的推理是有缺陷的,你能解释一下这个表达式([1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch)
)是一步步计算的吗?