Кратенько.

Jul 19, 2011 01:27

Сперва дам два определения. Они не точные, не претендуют на истину, просто для пояснения, что же я имею в виду ( Read more... )

параллельность, Эрланг, библиотеки, Хаскель

Leave a comment

migmit July 20 2011, 05:44:24 UTC
Ну, как обычно такие фреймворки делаются? Мы предоставляем ему коллбэк (возможно, не один - ну дык у нас на то ADT имеются), а он его время от времени дёргает:
function callback(request) {
... // create a suitable responce somehow
return responce;
}
function main() {
...
exitCode = runFramework(callback);
... // job is done
}(язык, само собой, абстрактный, C-подобный).

Допустим теперь, что в языке есть континуэйшены. Пишем:
var kOut, kIn;
function callback(request) {
return callCC k {
kIn = k;
kOut(Left(request));
}
}
function initFramework() {
return callCC k {
kOut = k;
exitCode = runFramework(callback);
return Right(exitCode);
}
}
function stepFramework(responce) {
return callCC k {
kOut = k;
kIn(responce);
}
}
function main() {
...
result = initFramework();
while(true) {
switch(result) {
case Left(request):
... // create a suitable responce somehow
result = stepFramework(responce);
case Right(exitCode):
... // job is done
}
}
}И шо мы видим? Мы видим, что фреймворк внезапно стал библиотекой. А две библиотеки отлично соединяются.

В чём catch? В том, что callCC - это эффект. Причём, эффект, в IO отсутствующий. То есть, если мы распишем это дело не на выдуманном языке, а на Хаскеле, то получим, что runFramework должно иметь тип не (Request -> IO Responce) -> IO ExitCode, а вовсе даже (Request -> ContT a IO Responce) -> ContT a IO ExitCode, а лучше MonadIO m => (Request -> m Responce) -> m ExitCode.

В языках типа C можно будет, видимо, обойтись аккуратной работой с setjmp/longjmp

Reply

migmit July 20 2011, 05:52:07 UTC
s/return Right(exitCode)/kOut(Right(exitCode))/

Так будет лучше.

Reply

migmit July 20 2011, 05:57:43 UTC
Кстати, то, о чём ты говоришь - это таки не параллелизм, это многопоточность.

Reply

thesz July 20 2011, 07:37:30 UTC
Да, согласен.

Reply

thesz July 20 2011, 07:36:12 UTC
>В чём catch? В том, что callCC - это эффект. Причём, эффект, в IO отсутствующий.

Вообще-то, там ещё две переменные, если тебе зрение callCC застил.

Reply

migmit July 20 2011, 10:59:21 UTC
Эм-м-м... и что, собственно?

Запись и чтение переменных - эффект, в IO наличествующий, а потому его можно и не учитывать.

Reply


Leave a comment

Up