为什么按这个顺序列出 monad 组合?

2023-11-30

我正在阅读有关列表单子的内容并遇到:

[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))是一步步计算的吗?


你的隐式括号是错误的。你拥有它的方式,n第一个 lambda 的参数不在范围内return。它更像是:

([1,2] >>= (\n -> ['a','b'] >>= (\ch -> return (n,ch))))

变成:

concatMap (\n -> concatMap (\ch -> [(n,ch)]) ['a','b']) [1,2]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么按这个顺序列出 monad 组合? 的相关文章

随机推荐

  • 使用“导出”从 SVN 发布,然后?如何升级?

    使用 SVN 我正在考虑使用 SVN 导出命令将第一个版本 版本 1 0 发布到生产服务器 升级的下一步是什么 例如 如果我想发布下一个版本 1 1 应该如何完成 有没有办法在不删除所有文件的情况下直接从标签升级 一般发布步骤 创建标签来自
  • 如何使用 Selenium RC 保存和恢复所有 cookie?

    我正在运行复杂的测试 为网站的不同部分创建许多 cookie 有时 我必须在长时间测试中重新启动浏览器 并且由于 Selenium 服务器不会修改基本 Firefox 配置文件 因此 cookie 会消失 有什么方法可以在终止浏览器之前将所
  • List 不是 List

    我有一个 Cloud Firebase 数据库 其中包含questions收藏 每个question有一个地图列表options 我正在使用 Flutter 并有以下课程question and option class Question
  • 如何使用 JavaScript 停止文件上传事件

    当我上传的文件超过 5mb 或者我的文件扩展名不是时 我想停止文件上传事件 jpg or png 我找到了一个代码 但是当我尝试上传无效的文件类型时 它只会提醒我上传了错误的文件 但不会取消该事件 这是代码
  • pxssh 抛出文件结尾 (EOF)。异常样式平台异常

    我在使用 pxssh 模块时遇到问题 我的代码如下 try ssh handle pxssh pxssh timeout None ssh handle logfile sys stdout ssh handle login host us
  • Kotlin函数用于获取子字符串的开始和结束索引

    我想知道是否有一些方法或方法组合可以获得这些结果 我的意思是你有一个字符串 ex Hello world how are you 我想实现以下功能 获取子字符串的开始和结束索引 在那根弦里 前任 substring world 起始索引为
  • 如何对小数位进行分组?

    我想要得到x 1 234 567 890 098 765 432 1 include
  • 更改 Chrome 状态栏中显示的 URL

    当我将鼠标悬停在 Chrome 中的某个网址上时 该网址会显示在 Chrome 状态栏中 就我而言 这会导致丑陋的 javascript bla bla bla 引用 当您将鼠标悬停在链接上时 有什么方法可以更改状态栏的内容吗 Thanks
  • 如何设置静态资源的依赖属性?

    我试图解决我无法指定动态值的事实ConverterParameter 请参阅我的其他问题 了解为什么我需要将动态值绑定到ConverterParameter 我不喜欢当前发布的解决方案 因为它们都需要我认为对我的视图模型进行不必要的更改 为
  • Tumblr 音频播放器无法通过无限滚动加载

    我在这个 tumblr 上实现了无限滚动和砌体 检查链接的修订版 音频播放器不会出现在通过无限滚动加载的帖子中 而是显示文本 需要 Flash 9 才能收听音频 Inspire Well tumblr 主题 我无法发布另一个超链接 但你可以
  • KnpMenuBundle - 发送选项并在 Twig 中使用它们

    我在 KnpMenuBundle 的导航栏菜单上写下了最后几天的内容 我只想简单地给模板一些参数 然后对其做出反应 是否可以 我试过这个 menu gt addChild Registration array route gt fos us
  • 如何在Python中替换列表中的单引号

    我有一个清单 my list 3 45 12 6 该列表包含单引号和双引号以及项目值 如何替换每个项目中的单引号或双引号 我尝试了下面 但结果是一样的 my list i replace for i in my list 您的列表不包含任何
  • 在 C++ 中,表达式“*pointer++”如何工作? [复制]

    这个问题在这里已经有答案了 include
  • htaccess自动检测域名

    我制作了自动创建子域的脚本 htaccess 工作正常 但问题是 在新域上安装时我需要手动更改域名 我想在htaccess中自动检测域名 可以吗 因此 当添加另一台服务器或新域时 无需再次更改域根htaccess 域根 htaccess 是
  • 类型错误:EventEmitter 不是新 MapboxGeocoder 的构造函数

    使用Vue 3 typescript vite 已经用Vite Vue 3 typescript搭建了项目 使用谷歌地图时遇到麻烦 因为它需要付费 然后尝试了 Mapbox 地图部分工作正常 但在添加 MapboxGeocoder 时显示错
  • iOS 快速发布请求

    所以我想创建一个具有以下输出的发布请求 user gt email gt email protected password gt FILTERED password confirmation gt FILTERED 相反 我得到 user
  • PHP:“遇到格式不正确的数值”

  • Google App Engine JDO 使持久延迟

    我的 Google App Engine JDO 实现存在问题 我无法弄清楚 文档 http code google com intl sv SE appengine docs java datastore jdo creatinggett
  • 无法通过 Spark 连接到 Mongo DB

    我正在尝试通过 Apache Spark master 从 Mongo DB 读取数据 我为此使用了 3 台机器 M1 上面有一个 Mongodb 实例 M2 带有 Spark Master 带有 Mongo 连接器 在其上运行 M3 带有
  • 为什么按这个顺序列出 monad 组合?

    我正在阅读有关列表单子的内容并遇到 1 2 gt gt n gt a b gt gt ch gt return n ch 它产生 1 a 1 b 2 a 2 b 我是这样理解的 隐式括号是 1 2 gt gt n gt a b gt gt