这是 Javascript 中有效的 monad 转换器吗?

2023-12-13

为了更好地理解 monad 转换器,我实现了一个。由于 Javascript 是动态类型的,所以我不会模仿类型或数据构造函数,而是仅声明普通的旧 Javascript 对象,这些对象包含相应的静态函数以形成特定的 monad / 转换器。基本思想是将这些方法应用于容器类型中的一个或多个值。可以说类型和容器是分开的。

Arrays 可以包含任意数量的元素。扩展是微不足道的Array以便它们实现 monad 接口。Arrays 也可以代表的两个变体maybe类型。一个空的Array对应于nothing. An Array单个元素对应于just(a)。因此我将使用Arrays 作为我的容器类型。请注意,这是一个快速而肮脏的实现,仅供学习之用:

const array = {
  of: x => Array.of(x),
  map: f => ftor => ftor.map(f),
  ap: ftor => gtor => array.flatten(array.map(f => array.map(f) (gtor)) (ftor)),
  flatten: ftor => ftor.reduce((xs, y) => xs.concat(y), []),
  chain: mf => ftor => array.flatten(array.map(mf) (ftor))
}

const maybe = {
  of: array.of,
  empty: () => [],
  throw: ftor => { if (ftor.length > 1) throw Error("indeterministic value"); return ftor },
  map: f => ftor => maybe.throw(ftor).map(f),
  ap: ftor => gtor => maybe.flatten(maybe.map(f => maybe.map(f) (gtor)) (ftor)),
  flatten: array.flatten,
  chain: mf => ftor => maybe.flatten(maybe.map(mf) (ftor)),
  T: M => {
    return {
      of: x => M.of(maybe.of(x)),
      empty: () => M.of(maybe.empty()),
      map: f => ftor => M.map(gtor => maybe.map(f) (gtor)) (ftor),
      ap: ftor => gtor => M.flatten(M.map(htor => M.map(itor => maybe.ap(htor) (itor)) (gtor)) (ftor)),
      flatten: maybe.flatten,
      chain: mf => ftor => M.chain(gtor => maybe.chain(mf) (gtor)) (ftor)
    };
  }
};

现在我将一个可能的变压器与单子数组结合起来以获得一个可以处理的单子arrays of maybes.

const arraym = maybe.T(array);

const add = x => y => x + y;
const addm = x => y => [x + y];
const arrayOfMaybes = [[1],[],[3]]

当我治疗时arraym作为一个应用函子,一切都按预期进行:

// yields: [[11],[],[13]] as expected
arraym.ap(arraym.map(add) (arrayOfMaybes)) (arraym.of(10));

然而,当我申请时chain出了问题:

// yields: [11,13] but [[11],[13]] expected
arraym.chain(x => arraym.chain(y => addm(x) (y)) (arrayOfMaybes)) ([[10]])

是这个问题的原因吗

  • 这不是一个有效的 monad 转换器?
  • 那我应用链的方式是错误的吗?
  • 我对结果的期望是错误的?

造成这个问题的原因是我应用链的方式不对吗?

是的。你需要通过一个mf返回一个arraym,不是一个array like addm做。你可以使用

const addmm = x => y => array.map(maybe.of)(addm(x)(y))
arraym.chain(x => arraym.chain( addmm(x) )(arrayOfMaybes))([[10]])

为了帮助解决这个问题,您还可以考虑实施lift对于每个 monad 变压器。

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

这是 Javascript 中有效的 monad 转换器吗? 的相关文章

随机推荐

  • PHP 会话超时 htaccess 文件

    您好 我是编程新手 但目前正在解决会话超时问题 基本上 即使我更改了 session gc maxlifetime 我的会话仍然超时 我认为另一个使用同一目录来存储未设置 maxlifetime 的会话数据的脚本正在运行 因此它将使用较短的
  • 如何更改窗口窗体标题字体大小和字体系列?

    我有一个带有窗口窗体的窗口应用程序 我必须更改此窗口表单标题文本 字体大小和字体系列等 我无法做到这一点 我附上一张图片以便更好地理解 您可以通过中的样式库来完成此操作定制边框表格CodePlex 上的项目 目前提供三种皮肤 Longhor
  • Arm链接器在函数调用中使用的“胶合板”是什么?

    我刚刚读过https www keil com support man docs armlink armlink pge1406301797482 htm 但无法理解arm链接器在函数调用之间插入的胶合板是什么 在 ARM 架构的过程调用标
  • 使用ggplotly时如何选择在工具提示中显示的变量?

    我有一个简单的数据框 seq lt 1 10 name lt c paste0 company 1 10 value lt c 250 125 50 40 40 30 20 20 10 10 d lt data frame seq name
  • 在javascript中向函数传递任意数量的参数

    我想写一个 javascript 函数 其工作原理如下 f a function e alert e results in alert a f a b function e1 e2 alert e1 e2 results in alert
  • 如何使用python中的平移矩阵将小图像的特定坐标放置到大图像的特定坐标

    我正在学习 OpenCV 我正在寻找 python 中的代码 该代码获取小图像的输入坐标并将其映射到大图像的坐标 以便将小图像插入到大图像中 并且可以像这样进行变换旋转 我想使用平移矩阵作为输入来做到这一点 例如 如果矩阵是 75 120
  • 同时在两个文本框上显示光标

    我有两个文本框 例如
  • 如何使用 ngx-webcam 在 Angular 中录制视频 - 捕获照片

    我目前正在开发一款可以在我的角度应用程序中录制视频的相机 目前 使用以下代码 我可以访问我的相机并拍摄快照 有人可以建议我应该修改代码中的哪些内容才能拍摄视频吗 App module ts 文件 import WebcamModule fr
  • 如何添加 JwtBearer 以及 AddMicrosoftIdentityWebAppAuthentication

    我不确定我是否完全理解 Microsoft Identity Web 的更改 但我正在关注一篇文章 微软在这里给出 其中描述了如何在启动时进行更改 services AddAuthentication AzureADDefaults Aut
  • 动态添加角色以授权 ASP.NET 5 中控制器的属性

    我对这篇文章有一个示例问题动态添加角色为控制器授权属性但对于 ASP NET 5 vNext 在 ASP NET 5 中 我无法按照上面的帖子所述覆盖 AuthorizeAttribute 类 那么如何在 ASP NET 5 vNext 中
  • Thrift无法从json反序列化为java对象

    我从以下 thrift 对象生成了一个 java 对象 struct Account 1 required string accountType 2 bool accountActive 我编写了一个java代码 尝试将java对象序列化为
  • 在 Qt Creator 中使用外部 Lib/DLL?

    经过一上午的一系列头痛之后 我决定 在我的第一个 Qt 项目中使用 Qt Creator 可能会比 MSVC 更好 编译时有太多问题 我想知道如何通过 Qt Creator 添加外部工具所需的 dll 和 libs 我找到了这个帖子将外部库
  • 调用数学编辑器

    是否有一个用于调用数学符号 公式的库 不知道该调用什么 它们是专门设计用于添加到可能以 html php 或 javascript 代码调用的网站中的 就像回答 提问页面中文本区域上方的粗体 斜体 链接等按钮一样 抱歉之前 当用户点击它时
  • 有没有办法获取日期时间选择器 (DTP) 中输入字段的句柄?

    The DATETIMEPICKERINFO通过发送获得的结构DTM GETDATETIMEPICKERINFO消息有一个字段hwndEdit这可能就是我正在寻找的 然而 我总是NULL所以我想知道它的实际含义是什么 如果没有 有没有办法获
  • Numpy 随机选择,仅沿一个轴替换

    我需要从数组中采样一堆点对 我希望每对都由两个不同的点组成 但这些点可能在各个对之间重复 例如 如果我的数组是X np array 1 1 2 3 then gt gt gt sample pairs X n 4 1 1 2 3 1 2 1
  • R:在带有多行命令的 system() 中使用 wait=FALSE

    我有一个长时间运行的进程 用 Java 编写 我希望与 system wait FALSE 异步运行 为了能够确定进程何时结束 我想根据中给出的建议创建一个文件如何确定以 system wait FALSE 启动的进程何时结束 问题是 等待
  • 在Python中提取列表元素

    这是我的第一个Python程序 我使用下面的代码来生成给定范围的组合 for k in range 0 items 1 for r in range 0 items 1 if r k gt 0 res x for x in itertool
  • 检查产品是否在愿望清单中

    我正在开发 Magento 主题 我需要构建一个函数来检查产品是否已添加到用户的愿望清单中 Magento 有一个 Mage Wishlist Helper Data 帮助程序类 但我不知道如何构建一个检查是否已在愿望清单中的函数 基本上我
  • OctoberCMS 如何重写用户插件的 onRegister() 函数?

    我在用着十月CMS基于 Laravel 我正在尝试覆盖用户插件 onRegister 功能 之前的答案帮助我扩展了插件 我想将用户名限制为字母数字alpha dash并限制为 50 个字符 原来的函数在帐户 php public funct
  • 这是 Javascript 中有效的 monad 转换器吗?

    为了更好地理解 monad 转换器 我实现了一个 由于 Javascript 是动态类型的 所以我不会模仿类型或数据构造函数 而是仅声明普通的旧 Javascript 对象 这些对象包含相应的静态函数以形成特定的 monad 转换器 基本思