list - 为什么要按这个顺序列出 monad?

标签 list haskell syntax monads parentheses

我正在阅读关于 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/

相关文章:

python - 更改列表中的特定索引

haskell - let..in 中 where 子句的范围

linux - cabal 安装 hoogle 不工作

css - CSS 中 '@' 符号的用途是什么?

javascript - 仅将列表中的项目转移到另一个列表javascript

javascript - 使用js在选择时获取所选项目

perl - 如何从在 Perl 中返回文件句柄的方法中读取数据?

java - ArrayUtil 在 Java 中导致意外错误

python - 如何在 Python 中循环列表

Haskell 模式匹配 do 表达式编译器警告