Как кодировать отложенный тип с помощью Church?

С помощью функций мы можем абстрагироваться от любого типа. Вот пример типа 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. Но я не знаю правильного подхода и имеет ли смысл такое усилие с церковным кодированием. Вот мой первый снимок:

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

Я здесь совершенно в темноте. Приводит ли этот подход к чему-либо значимому?


person Community    schedule 24.11.2018    source источник
comment
None(0) выглядит неправильно. Я бы предпочел ожидать что-то вроде run(sqr)(None)(0)/run(sqr)(Some(5))(0) или даже run(sqr)(0)(…).   -  person Bergi    schedule 24.11.2018
comment
если такая попытка вообще имеет смысл с Church Encoding - я так не думаю. ваш отложенный тип для ленивых вычислений похож на монаду продолжения. Ему не нужна кодировка, так как есть только один случай.   -  person Bergi    schedule 24.11.2018
comment
@Bergi Да, None(0) неправильно, вместо run(sqr) (0) (Some(5)), как вы сказали.   -  person    schedule 24.11.2018
comment
@Bergi Берги Я думаю, что это недостающее звено. Черчу (и Скотту соответственно) требуются разные кейсы (конструкторы) для выполнения операции fold/uncons. Deferred - это просто функция в стиле передачи продолжения.   -  person    schedule 24.11.2018
comment
Рад, что вы согласны - я опубликую это как ответ   -  person Bergi    schedule 24.11.2018


Ответы (1)


Кодирование Черча (а точнее, кодирование Скотта) обеспечивает способ кодирования ветвления в типе данных с различными случаями (например, конструкторы экземпляров). Однако ваш тип Deferred является оболочкой (newtype) над функцией, которая принимает продолжение, нет нескольких случаев для кодирования. Я не думаю, что вы можете применить эту концепцию здесь.

person Bergi    schedule 24.11.2018