我正在阅读关于 list monads 并遇到:
[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)]
因为
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs) -- this line
fail _ = []
所以
concat (map f xs)
是 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)
)是如何逐步计算的吗?
最佳答案
你的隐式括号是错误的。您拥有它的方式,n
第一个 lambda 的参数不在 return
的范围内.它更像是:
([1,2] >>= (\n -> ['a','b'] >>= (\ch -> return (n,ch))))
变成:
concatMap (\n -> concatMap (\ch -> [(n,ch)]) ['a','b']) [1,2]
关于list - 为什么要按这个顺序列出 monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47397486/