continuation'ы и их типизация
От: WolfHound  
Дата: 08.02.08 17:43
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Т.е. можно так (я просто не знаю)?

yield возвращает не T, а генератор[T]
Те можно так
Yield[T](value: T) : IEnumerable[T]
{
    yield value;
}

Foo[T](fn: T -> IEnumerable[T])...
{
    ...fn(T);
}

Foo(Yield)


L>(if (eq? 3 (amb 1 2 3 4 5))
L>    1
L>        (amb)) - первый amb обязательно вернёт 3, иначе будет ошибка в программе (второй amb).

В данном случае как я понимаю происходит следующие:
первый amb возвращает 1
eq говорит что 1 не равно 3
if выполняет ветку с amb
это приводит к откату к первому amb
тк он уже возвращал 1 он идет дальше и возвращает 2
...
когда первый amb возвращает 3 if возвращает 1
Я прав?
Если да то что будет если после выхода из if опять случится amb? Первый amb вернет 4 или что будет?

L>palm_mute очень интересно про них рассказывал здесь:

L>http://palm-mute.livejournal.com/12291.html
Понятно.
Правда не ясно какие проблеы с типизацией continuations?

2) динамическая типизация (типизация continuations — это отдельная тема, которой бы не хотелось сейчас касаться).


Если я чегото понимаю то call/cc имеет такую сигнатуру (псевдо немерле):
call/cc[T](fn : (T -> _|_) -> T) : T;

Те сам continuation имеет тип
type Continuation[T] = T -> _|_;

Про _|_ читать тут Total Functional Programming — сильное ФП
Автор: Курилка
Дата: 18.01.08

Да именно _|_ ибо при вызове continuation'а мы не получаем управление назад те _|_ по определению.

Делать на continuation'ах исключения легко ибо throw имеет сигнатуру
Throw(ex : Exception) : _|_;

И соответственно
TryCatchFinally[T](tryFn : () -> T, catchFn : Exception -> option[T], finallyFn : () -> ()) : T;

Если catchFn вернет None исключение пробрасывают дальше.
Единственное нужно придумать где хранить continuation который создается внутри TryCatchFinally.
У меня есть некоторые мысли но я их пока не формализовал.

L>http://okmij.org/ftp/Computation/Continuations.html

Это еще не смотрел.
... << RSDN@Home 1.2.0 alpha rev. 745>>

10.02.08 20:51: Ветка выделена из темы C++0x начали урезать
Автор: Andrei F.
Дата: 09.11.07
— WolfHound
10.02.08 20:52: Перенесено модератором из 'Философия программирования' — WolfHound
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.