Почему в Scheme нет обещания типа данных?

Объект, возвращаемый delay в схеме, является «обещанием», но обещания не считаются типом (поэтому нет promise? процедуры, и он не указан как тип в R5RS или R6RS).

Есть ли сильный резонанс, почему это так? Мне показалось бы вполне естественным, например, сделать что-то вроде (if (promise? x) (force x) x). (И я вижу, что некоторые реализации позволяют принудительно выполнять невыполнение обещаний, а другие - нет). Кроме того, если я могу сохранить что-то в переменной и передавать ее, я чувствую, что у нее должен быть тип.


person Jay    schedule 23.09.2010    source источник


Ответы (2)


Не может быть такой веской причины, поскольку Схема MIT / GNU, определяет promise? функцию.

person Marcelo Cantos    schedule 23.09.2010

Я думаю, что это позволяет более оптимизировать реализацию delay/force. Тот факт, что принудительное значение может быть запомнено (так что обещание действительно принудительно выполняется только один раз, а результирующее значение возвращается при последующих force вызовах) стирает различие между обещанием и его результирующим значением. Если у вас есть promise?, вы не можете заменить принудительное обещание его значением везде, где это необходимо. Следовательно, в зависимости от реализации обещание может быть неотличимо от любого другого значения схемы.

person eljenso    schedule 23.09.2010
comment
В этом есть смысл! Спасибо за ответы. (Я все еще думаю, что может быть предикат обещания?, Который будет отвечать на #t всякий раз, когда вы можете применить силу к объекту - даже если он всегда возвращает true.) - person Jay; 23.09.2010
comment
Подождите, какое отношение мемоизация имеет к типам (принудительно x) и x? Force всегда будет возвращать значение, а x всегда является обещанием, если я не понимаю это неправильно. - person erjiang; 26.09.2010