Протягом усього минулого року мені писали код Scala (походить з фону Java). Мені дуже сподобалось, як можна створити простіший і чистіший код, використовуючи вали, класи регістрів, функції карти / фільтра / лямбда, імпліцити та умови виводу. Я використовував його здебільшого для програми на базі Akka .
Цього року я працюю над проектом Scala з новою командою, яка дуже любить функціональне програмування. Вони активно використовують Scalaz , і код скрізь заповнений додатками, контекстними межами, читачем / автором / монадою держави, навіть основний метод "загорнутий" у монаду вводу / виводу. Їх міркування полягають у тому, що це змушує компілятор "працювати на нас", стверджуючи, що код правильний, і кожна функція не має побічних ефектів.
Незважаючи на це, з моєї точки зору, весь цей синтаксис дійсно перешкоджає діловій логіці. Наприклад, тип "MyBusinessObject" є прекрасним, а також такі типи, як "Список [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
змінною, чи не так?) Тепер функціональні мови програмування із узгодженням шаблону іноді вводять ще кілька змінних, де ви просто виписати дзвінки методу аксесуара в ОО. Результат, як правило, більш стислий; можливо трохи менше пояснення, але пошук декларації даних зазвичай дає зрозуміти це швидко. Статичний набір тексту дуже допомагає, це не так, як в APL.