如何从多个嵌套函数中丢弃分隔的延续?

2024-03-29

我研究了分隔延续,目前正在尝试丢弃它们以获得类似于引发异常的效果。

这就是给我带来麻烦的原因:

const structure = type => cons => {
  const f = (f, args) =>
   ({["run" + type]: f, [Symbol.toStringTag]: type, [Symbol("args")]: args});

  return cons(f);
};

const Cont = structure("Cont")
  (Cont => f => Cont(f));

const runCont = tf => k =>
  tf.runCont(k);

const reset = tf =>
  of(tf.runCont(id));
  
const shift = f =>
  Cont(k => f(k).runCont(id));

const of = x =>
  Cont(k => k(x));
  
const liftM2 = f => tf => tg =>
  of(runCont(tf) (x => runCont(tg) (y => f(x) (y))));

const id = x => x;

const mulM = liftM2(x => y => x * y);
const addM = liftM2(x => y => x + y);
const subM = liftM2(x => y => x - y);

const z1 = mulM(of(5))
  (reset
    (addM
      (shift(k => of(3)))
        (of(3)))
  ).runCont(id); // 5 * 3 = 15 (as expected)

const z2 = mulM(of(5))
  (reset // A
    (mulM // B
      (addM
        (shift(k => of(3))) // C should unwind up to A instead of B
          (of(3)))
            (of(4)))
  ).runCont(id); // 5 * 3 * 4 = 60 (but 15 expected)

console.log(z1);
console.log(z2);

似乎我只能将堆栈展开一帧。这是设计使然吗shift/reset还是由我的实施中的缺陷引起的?

[EDIT]

我让它工作了Haskell https://repl.it/repls/TastyCadetblueProcess,即这是一个实现问题:

reset :: ((a -> a) -> a) -> (a -> r) -> r
reset k f = f $ k id

shift :: ((a -> r) -> (r -> r) -> r) -> (a -> r) -> r
shift f k = f k id

return :: a -> (a -> r) -> r
return a k = k a

liftM2 :: (a -> b -> c) -> ((a -> r) -> r) -> ((b -> r) -> r) -> (c -> r) -> r
liftM2 f ma mb k = ma $ \a -> mb $ \b -> k (f a b)

example :: Num a => (a -> r) -> r
example = liftM2 (*) (return 5) (reset (liftM2 (*) (return 3) (liftM2 (+) (return 2) (shift (\k -> return 3)))))

我认为你的liftM2是坏了,因为它不懒。而不是使用of,它应该构造一个新的延续:

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

如何从多个嵌套函数中丢弃分隔的延续? 的相关文章

  • HTML 嵌入对象具有灰色背景。可以透明吗?

    我使用带有开源插件的 Firefox 来播放视频 视频被 尽可能好地 缩放以适应嵌入对象的宽度和高度中定义的可用空间 但有时右侧和 或底部会有一点灰色边框 看来这不是我的父 div 的背景颜色 因为更改它根本没有效果 这是 HTML div
  • 跨延迟加载路由创建共享模块

    我正在构建一个 Angular 11 应用程序并尝试创建一个SharedModule 我正在使用延迟加载 并希望避免在延迟加载的路由中多次加载公共模块 我创建了一个共享模块并将其导入到我的AppModule 根据我的理解 这个共享模块应该在
  • 按列分组的数据帧上 R 中的行之间的差异

    我希望通过 app name 获得不同版本的计数差异 我的数据集如下所示 app name version id count difference 这是数据集 data structure list app name structure c
  • 在应用程序的所有活动中重用操作栏

    我创建了一个 MenuActivity 它有一个操作栏和一个拆分操作栏 我想将此操作栏和 splitactionbar 视图用于我的应用程序中的所有活动 我是 android 的新手 所以有人可以逐步指导我 另外 我试图将搜索图标放在操作栏
  • 每次在我的 AWS SQS 目标上推送通知时如何触发事件?

    我正在将 AWS SQS 用于 Amazon MWS 订单 API 每当有人从已将我添加为其开发人员的卖家帐户订购时 亚马逊都会将通知发送到我的 AWS SQS 应用程序 我可以从那里提取通知 但为此 我必须创建一个调度程序来提取通知 我是
  • 如何防止 Safari 滚动溢出:隐藏的 iframe?

    使用 Safari 您可以通过设置 style overflow hide 来禁用大多数 iframe 滚动 在 iframe 上 但是 如果您单击 iframe 并移动鼠标 内容无论如何都会滚动 Example 滚动内容 html
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He
  • 安装 APK 时出现会话“应用程序”错误

    我在将 Android Studio 1 1 编写的项目导入 Android Studio 2 1 2 时遇到困难 每当在平板电脑上测试应用程序之前构建 gradle 时 我都会收到此错误 下面是错误的屏幕截图 有谁知道是什么问题 我尝试过
  • 使用 wmi 获取活动会话(Win32_LogonSession 还返回非活动/旧会话)

    有没有办法只显示 wmi 的活动会话 问题是 Win32 LogonSession 还显示不活动 断开连接的会话 ManagementScope scope new ManagementScope ManagementPath Defaul
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • 重定向到破折号中的 url

    我正在使用 dash 构建一个仪表板 每当单击特定数据点时 我都会创建一个唯一的 url 如何将用户重定向到此创建的 url 我正在使用下面给出的代码 每当有人单击任何数据点时 单击事件就会触发并执行回调函数 app layout html
  • CSS - 为什么我无法设置 元素的高度和宽度?

    我正在尝试使用以下 html 标记创建 css 按钮 a href access php class css button red Forgot password a 但它最终不会比中间的文本大 即使我已经设置了班级的高度和宽度 顺便说一句
  • 如何将 c_uint 的 ctypes 数组转换为 numpy 数组

    我有以下 ctypes 数组 data ctypes c uint 100 我想创建一个 numpy 数组np data包含来自 ctypes 数组数据的整数值 ctypes 数组显然稍后会填充值 我看到numpy中有一个ctypes接口
  • 如何使用 Spark 2 屏蔽列?

    我有一些表 我需要屏蔽其中的一些列 要屏蔽的列因表而异 我正在读取这些列application conf file 例如 对于员工表如下所示 id name age address 1 abcd 21 India 2 qazx 42 Ger
  • 在应用程序内核中找不到 FOSUserBundle

    我在 Windows 上使用 symfony 并尝试按照官方文档中的描述配置 FOSUserBundle 尝试更新架构时出现此错误 Class FOS UserBundle FOSUserBundle not found in app Ap
  • 如何通过API集成keycloak短信验证?

    我有一个 keycloak 服务器和使用自定义 KeycloakProvider 的 Laravel 应用程序 public function loginByEmail string email string password SsoTok
  • KIOSK 系统的一台 PC 上有多个显示器

    我正在使用 PHP HTML5 和 Javascript 开发 KIOSK 系统 我想在一台 PC 上连接多个 触摸屏 显示器 我希望这些监视器以全屏模式显示浏览器 用户只能访问 我的网站 而无需任何其他控件 他们不会有鼠标或键盘 他们不应
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include
  • Swift - 在 TableView 单元格中使用步进器递增标签

    这里又是一个 Swift 初学者 我只是想在每个 TableView 单元格中使用一个步进器来增加同一单元格中的标签 我发现了关于这个主题的几个问题 但它们包含其他元素 我无法提取基本概念 Swift Stepper Action 更改同一
  • 使用 net.liftweb.json 或 scala.util.parsing.json 解析大型 (30MB) JSON 文件会出现 OutOfMemoryException。有什么建议吗?

    我有一个包含大量测试数据的 JSON 文件 我想解析这些数据并推送我正在测试的算法 它的大小约为 30MB 包含大约 60 000 个元素的列表 我最初在 scala util parsing json 中尝试了简单的解析器 如下所示 im

随机推荐