Napisałem wniosek o zrównoważenie krajowego harmonogramu wytwarzania energii dla portfela elektrowni do pozycji handlowej dla firmy energetycznej. Składniki klienta i serwera były w języku C #, ale silnik obliczeniowy został napisany w języku F #.
Zastosowanie F # w celu rozwiązania problemu złożoności w sercu tej aplikacji wyraźnie pokazuje, że język oprogramowania firmowego jest najsłabszy, a mianowicie złożoną algorytmicznie analizę dużych zbiorów danych. Moje doświadczenie było bardzo pozytywne. W szczególności:
Jednostki miary Przemysł, w którym pracuję, jest zaśmiecony jednostkami. Wprowadzone przeze mnie równania (często o charakterze geometrycznym) dotyczyły jednostek czasu, mocy i energii. Sprawdzanie poprawności jednostek wejściowych i wyjściowych funkcji w systemie typów to ogromna oszczędność czasu, zarówno pod względem testowania, jak i odczytu / rozumienia kodu. Eliminuje całą klasę błędów, na które podatne były poprzednie systemy.
Programowanie eksploracyjne Praca z plikami skryptowymi i REPL (F # Interactive) pozwoliła mi lepiej zbadać przestrzeń rozwiązania przed przystąpieniem do implementacji niż bardziej tradycyjna pętla edycji / kompilacji / uruchomienia / testu. Jest to bardzo naturalny sposób dla programistów, aby budowali swoje zrozumienie problemu i napięć projektowych w grze.
Testowanie jednostkowe Kod napisany przy użyciu funkcji niepowodujących efektów ubocznych i niezmiennych struktur danych to przyjemność testować. Nie ma skomplikowanych interakcji zależnych od czasu, które mogłyby spieprzyć sprawę, lub dużych zestawów zależności, które można wyśmiewać.
Interoperacja Zdefiniowałem interfejs do silnika obliczeniowego w C # i wdrożyłem obliczenia w F #. Silnik obliczeniowy można następnie wprowadzić do dowolnego modułu C #, który musiał go używać bez żadnych obaw o interoperacyjność. Bezszwowy. Programista C # nigdy nie musi wiedzieć.
Redukcja kodu Wiele danych wprowadzonych do silnika obliczeniowego miało postać wektorów i macierzy. Funkcje wyższego rzędu jedzą je na śniadanie z minimalnym zamieszaniem, minimalnym kodem. Piękny.
Brak błędów Programowanie funkcjonalne może wydawać się dziwne. Mogę pracować nad algorytmem, ciężko próbując zdobyć kod, aby przekazać moduł sprawdzania typu, ale gdy moduł sprawdzania typu jest zadowolony, to działa. Jest prawie dwójkowy, albo się nie skompiluje, albo jest poprawny. Dziwne błędy przypadku krawędzi są minimalizowane, funkcje rekurencji i wyższego rzędu usuwają wiele kodu księgowego, który wprowadza błędy przypadku krawędzi.
Równoległość Czystość funkcjonalna wynikowej implementacji sprawia, że jest ona gotowa do wykorzystania nieodłącznej równoległości w przetwarzaniu wektorów danych. Być może właśnie tam pójdę teraz, kiedy .NET 4 jest dostępny.