Здравствуйте, 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:52: Перенесено модератором из 'Философия программирования' — WolfHound