【问题标题】:How to encode a Deferred type with Church?如何用 Church 编码延迟类型?
【发布时间】:2018-11-24 18:45:29
【问题描述】:

我们可以从任何类型中抽象出函数。这里以Option 类型为例:

const Some = x => y =>
  k => k(x);

const None = y =>
  k => y;

const sqr = n => n * n;

const run = f => t => t(f);

const x = Some(5) (0),
  y = None(0);

run(sqr) (x); // 25
run(sqr) (y); // 0

现在我想对延迟类型进行编码以获得 Javascript 中的惰性效果。但我不知道正确的方法,以及这种努力是否对 Church Encoding 有意义。这是我的第一张照片:

const Deferred = thunk =>
  k => k(thunk());

const inc = n => n + 1;

const sqr = n => n * n;

const run = f => t => t(f);

const x = Deferred(() => inc(4));

run(sqr) (x); // 25

我在这里完全处于黑暗之中。这种方法会带来什么有意义的东西吗?

【问题讨论】:

  • None(0) 看起来不对。我宁愿期待像 run(sqr)(None)(0)/run(sqr)(Some(5))(0) 甚至 run(sqr)(0)(…) 这样的东西。
  • 如果这样的努力甚至对 Church Encoding 有意义” - 我不这么认为。您延迟评估的延迟类型类似于延续单子。它不需要任何编码,因为只有一个案例。
  • @Bergi 是的,None(0) 是错误的,而不是 run(sqr) (0) (Some(5)),正如你所说。
  • @Bergi 我认为这是缺少的链接。 Church(和 Scott,分别)需要不同的情况(构造函数)来执行他们的 fold/uncons 操作。 Deferred 只是一个延续传递风格的函数。
  • 很高兴你同意 - 我会把它作为答案发布

标签: javascript functional-programming lazy-evaluation thunk church-encoding


【解决方案1】:

Church 编码(更准确地说,Scott 编码)提供了一种对具有不同情况(例如实例构造函数)的数据类型中的分支进行编码的方法。但是,您的 Deferred 类型是对需要延续的函数的(新类型)包装器,无需编码多个案例。我认为你不能在这里应用这个概念。

【讨论】:

    猜你喜欢
    • 2019-07-31
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2017-06-30
    • 2017-02-12
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多