LINUX.ORG.RU

История изменений

Исправление dave, (текущая версия) :

А если я возвращаю какое-то Callable, у которого call() просто вызывает println() - это слегка похоже на принцип работы этого в хаскеле?

Да, похоже, но только этого мало. По хорошему нужны гарантии, что call() ты сам никак вызвать не можешь, иначе, как я понял, может быть нарушена ссылочная прозрачность (в хаскеле такой call называется unsafePerformIO, который уместен, главным образом, для вызова сторонних сишных чистых функций типа синуса). А без ссылочной прозрачности игра совершенно не стоит свеч.

То есть, возвращаясь к изначальному посту, можно сказать, что @pure, если его реализовать для джавы, будет неполноценным костылем просто в силу того, что в джаве нет вот такого «возвращения вычислений IO»? Если я правильно понял.

Callable вернуть совершенно не проблема. Это можно легко сделать на любом языке с автоматической системой управления памятью.

На мой взгляд вторая проблема в том, что в java нет удобного синтаксического сахара для работы с вычислениями на вроде IO. Из известных языков, кроме хаскеля, что-то похожее есть только в F# в виде computation expressions, но по слабее. В scala же все не то, ни for-comprehension, ни плагин продолжений.

Потом возникает проблема с производительностью. Компилятор хаскеля очень умен, во-первых. Во-вторых, он полагается на ссылочную прозрачность и чистоту при компиляции. Поэтому он способен порождать очень эффективный код из всех этих вычислений IO.

А что мы будем иметь в Java? Например, компилятор F# порождает довольно неэффективный код для своих computation expressions.

Так что, нет практического смысла в @pure для java на мой взгляд, хотя если заняться нечем...

Исходная версия dave, :

А если я возвращаю какое-то Callable, у которого call() просто вызывает println() - это слегка похоже на принцип работы этого в хаскеле?

Да, похоже, но только этого мало. По хорошему нужны гарантии, что call() ты сам никак вызвать не можешь, иначе, как я понял, может быть нарушена ссылочная прозрачность (в хаскеле такой call называется unsafePerformIO, который уместен, главным образом, для вызова сторонних сишных чистых функций типа синуса). А без ссылочной прозрачности игра совершенно не стоит свеч.

То есть, возвращаясь к изначальному посту, можно сказать, что @pure, если его реализовать для джавы, будет неполноценным костылем просто в силу того, что в джаве нет вот такого «возвращения вычислений IO»? Если я правильно понял.

Callable вернуть совершенно не проблема. Это можно легко сделать на любом языке с автоматической системой управления памятью.

На мой взгляд первая проблема в том, что в java нет удобного синтаксического сахара для работы с вычислениями на вроде IO. Из известных языков, кроме хаскеля, что-то похожее есть только в F# в виде computation expressions, но по слабее. В scala же все не то, ни for-comprehension, ни плагин продолжений.

Потом возникает проблема с производительностью. Компилятор хаскеля очень умен, во-первых. Во-вторых, он полагается на ссылочную прозрачность и чистоту при компиляции. Поэтому он способен порождать очень эффективный код из всех этих вычислений IO.

А что мы будем иметь в Java? Например, компилятор F# порождает довольно неэффективный код для своих computation expressions.

Так что, нет практического смысла в @pure для java на мой взгляд, хотя если заняться нечем...