Будучи давним Java-программистом и в последние годы зависимым от Haskell, я сейчас изучаю Scala.
Поздравляю:)
Какпрограмма без побочных эффектов на Java?т.е. как я могу сделать вручную то, что Scala делает для меня?
Что ж, Scala не делает для вас слишком много (по сравнению с Haskell) с точки зрения принудительного применения или помощи без побочных эффектовстиль.Например, у вас всегда есть возможность в Scala использовать var
везде, где вам угодно, тогда как в Haskell, если вам нужен изменяемый IORef
или STRef
, вам нужно указать это системе типов, используя соответствующую монаду.
Другими словами, хотя вы спрашиваете, как имитировать стиль Scala в Java, первый шаг, который нужно рассмотреть, - это как имитировать стиль Haskell в Scala, где, конечно, Scalaz вступает в игру.
Учитывая все вышесказанное, я думаю, что вы в основном ответили на свой вопрос:
Я думаю, что можно получить многие из известных преимуществ с помощью простой старой Java и немного дисциплины (например, неизменяемые коллекции, конечные значения, жесткие методы, которые не изменяют состояние объекта / приложения).
Дисциплина - это как минимум половина истории.Простое использование final
и неизменных коллекций (а-ля Guava ) имеет всевозможные последствия для того, как будет выглядеть ваш код.Другая половина истории, конечно, что вы делаете, когда ваша программа требует побочных эффектов (таких как ввод-вывод)?В Haskell вы бы использовали монаду IO
, а в Scala вы можете использовать scalaz.effects.IO
, но в Java, честно говоря, я думаю, что сражаться не стоит.
По моему мнению, две наиболее важные строки кода функционального стиля, которые вы будете писать в любой программе Java, следующие:
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
Остальное - упражнение для читателя;)