Przez cały miniony rok pisałem kod Scala (pochodzący z Java). Naprawdę podobało mi się, jak można stworzyć prostszy i bardziej przejrzysty kod z vals, klasami przypadków, funkcjami map / filter / lambda, implikacjami i wnioskowanie o typie. Użyłem go głównie do aplikacji opartych na Akce .
W tym roku pracuję nad projektem Scala z nowym zespołem, który naprawdę lubi programowanie funkcjonalne. Często używają Scalaz , a kod jest wszędzie wypełniony aplikacjami, granicami kontekstu, czytnikiem / pisarzem / monadą stanu, nawet główna metoda jest „zawinięta” w monadę we / wy. Ich rozumowanie polega na tym, że kompilator „działa dla nas”, zapewniając, że kod jest poprawny, a każda funkcja jest wolna od skutków ubocznych.
Mimo to z mojego punktu widzenia cała ta składnia naprawdę przeszkadza w logice biznesowej. Na przykład rodzaj „MyBusinessObject” jest w porządku, a także typy takie jak „List [MyBusinessObject]”, „Option [MyBusinessObject]” lub nawet „Future [MyBusinessObject]”. Wszystkie mają jasne znaczenie i cel. Z drugiej strony kod taki jak:
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
}
}
czy to dodaje złożoności programowi, czy tylko ja nie jestem przyzwyczajony do tego sposobu programowania?
>>=
i <$>
, które nic nie znaczą, dopóki ty wiedzieć, co robią. Po zapoznaniu się z ich znaczeniem czytają mi teraz bardzo naturalnie i szybko. Nie do końca odpowiedź, tylko moje obiektywne doświadczenie z takimi rzeczami. Używam również Scali, ale nie mam doświadczenia z biblioteką Scalaz.
for(i=0; i<7; ++i) { trivialOperation(i); }
przy pomocy jakiejś niewygodnej trivialOperationCount
zmiennej, prawda?) Teraz, funkcjonalne języki programowania z dopasowaniem wzorców czasami wprowadzają więcej zmiennych, w których po prostu wypiszę wywołania metody akcesora w OO. Wynik jest ogólnie bardziej zwięzły; być może nieco mniej zrozumiałe, ale przeglądanie deklaracji danych zwykle szybko to wyjaśnia. Pisanie statyczne bardzo pomaga, nie jest tak jak w APL.