【发布时间】: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