За весь прошлый год я написал Scala- код (исходящий из Java-фона). Мне очень понравилось, как вы могли бы создавать более простой и понятный код с использованием vals, case-классов, функций map / filter / lambda, имплицитов и вывода типа. Я использовал его в основном для приложений на основе Akka .
В этом году я работаю над проектом Scala с новой командой, которая действительно любит функциональное программирование. Они интенсивно используют Scalaz , и код везде заполнен аппликативами, границами контекста, монадой «читатель / писатель / государство», даже основной метод «обернут» в монаду ввода / вывода. Их аргументация заключается в том, что это заставляет компилятор «работать на нас», утверждая, что код верен, и каждая функция не имеет побочных эффектов.
Тем не менее, с моей точки зрения, весь этот синтаксис действительно мешает бизнес-логике. Например, тип «MyBusinessObject» подходит, а также такие типы, как «List [MyBusinessObject]», «Option [MyBusinessObject]» или даже «Future [MyBusinessObject]». Все они имеют четкое значение и цель. С другой стороны, код вроде:
def method[M[_]: Applicative] = {
case (a, b) => (ca[M](a) |@| cb[M](b)) {
case t @ (ra, rb) =>
if (ra.result && rb.result) t.right
else t.left
}
}
это добавляет сложности программе, или это только я, что я не привык к такому способу программирования?
>>=
и <$>
, которые ничего не значат, пока вы знать, что они делают. Однако, узнав, что они значат, они теперь очень естественно и быстро читают мне. Не совсем ответ, просто мой объективный опыт с такими вещами. Я также использую Scala, но у меня нет опыта работы с библиотекой Scalaz.
for(i=0; i<7; ++i) { trivialOperation(i); }
с какой-нибудь неуклюжей trivialOperationCount
переменной, не так ли?) Теперь функциональные языки программирования с сопоставлением с образцом иногда вводят еще несколько переменных, где вы просто выписать вызовы методов доступа в OO. Результат обычно более лаконичен; возможно, немного менее очевидный, но поиск декларации данных, как правило, быстро дает понять. Статическая типизация очень помогает, это не так, как в APL.