Początki w Haskellu

Zainspirowany tym artykułem postanowiłem nauczyć sie Haskella i zrobić nawet jakąś webaplikację. Póki co w ciągu pierwszej doby nauczyłem się rekordowo dużo (bo szczerze mówiąc prawie nic innego nie robiłem, nie licząc ciagłego dependency hell z cabalem).

Póki co spore wrażenie na mnie robi, że ten język (w sumie to zasługa kompilatora) jest piekielnie szybki. Podobno jest 30% wolniejszy niż C. Póki co zrobiłem mały test jeśli chodzi o silnię. Wybrałem jako przeciwników Javę i C. C z gmp miało wynik 1,17s, Haskell wykonał się w 2,67s, a Java z BigDecimal... ok. 44s.

Kodów w Javie i C pokazywać nie będę, każdy miał po kilkanaście linijek, każdy może sobie sam napisać, nic trikowego tam nie było. Za to kod w Haskellu ograniczył się do:
main = print $ product [1..50000]
Co ciekawsze dłuższa, rekurencyjna wersja działa tak samo szybko. Tak, w Haskellu nie musimy się przejmować przepełnieniem stosu, a rekurencja jest podstawą, a nie czymś co trzeba jak najszybciej przepisać do pętli.

To może teraz objaśnię ten kawałek kodu, tak jak w wielu innych językach definiujemy tutaj funkcję main, która jest wywoływana w momencie uruchomienia programu. Nie będę mówił co ta funkcja zwraca, bo to już większa filozofia, w każdym razie powstaje to to w funkcji print. Tam się pojawia znaczek $, która zmienia sposób wykonywania funkcji. Gdyby go nie było, to przyjmując pisownię przyjazną dla nieznających Haskella funkcje wywołały by się tak:
(print(product))([1..50000])
To by się najzwyczajniej wywaliło, bo print nie przyjmuje jako argument funkcji. Z operatorem $ sprawa wygląda tak:
print(product([1..50000]))
Czyli tworzy listę liczb od 1 do 50000, mnoży je i wyświetla (czyli print wyrzuca z siebie odpowiedni wynik).