jarekr000000
2018-01-11 09:11

TLDR;
Nauczyłem się Haskella (jako tako), poprawiając kluczowy bug w nowym kompilatorze Haskella, napisanym w Haskellu. https://github.com/typelead/eta/issues/603

Chwalpost.

Od dawna czułem, że musze się podciągnąc w Haskellu, bo mimo, że miałem z nim styczność jeszcze gdzieś w 2000 to nigdy nie wyszedłem poza robienie prostych ćwiczeń na quicksort, fibonacci itp. (tzw. 'starczy na juniora').

W tym celu postanowiłem założyć vloga o programowaniu.
W tym celu postanowiłem programować.

Na początek poszły jeszcze zabawy z Codingame. Duży plus dla tego dzieła, bo o ile przykłady, które robiłem, nadal były proste, to jednak już wymagały korzystania z IO Monad. Jest to w Haskellu, z punktu widzenia Javowca/C++/Scala, nietypowo zrobione. Troszkę frustracji było. Jakkolwiek sama codingame to świetna zabawa.

A potem Paweł (ten od "Encja na twarz i pchasz") namówił mnie żebym się przyjrzał Eta (http://eta-lang.org/) czyli Haskellowi na JVM. (Tak naprawdę to mieliśmy razem zrobić na ten temat przezentacje, ale moja doskonała organizacja pracy i inne zalety itp. cały ten pomysł wypie....)
Sam pomysł Eta jest fajny: piszesz logikę biznesową w "czystym" Haskellu, a cały syf technchniczny (middleware - np. Spring) jest zrobiony w Javie. Poza tym autorzy dość ambitnie chcą połączyć wydajność języków funkcyjnych z wydajnością JVM (który akurat w przypadku jezyków funkcyjnych, się do tej pory zupełnie nie sprawdzał).

Tak czy siak zabawa z Eta zaczeła się od Quicksort i Fibonacci.... a potem postanowiłem sprawdzić czy ta Eta jest czegoś warta i czy działa optymalizacja wywołań ogonowych.
Na fibonaccim. Takim:

fibbtcoinner 0 sum presum  = sum
fibbtcoinner n sum presum = fibbtcoinner  (n-1) (sum + presum) sum

fibbtco n = fibbtcoinner n 1 0
main = do
        putStrLn $ show $ fibbtco <$> arr
        where
arr = [0..10]

(zwróćcie uwagę na absurdalne podwójne b w fibonaccim - mój znak rozpoznawczy).

Z dobrych wieści: testy na większych n pokazały, że TCO działa.
Plusy ujemne: okazało się, że stworzyłem najgorszą implementację fibonacci ever.
Dawała takie wyniki:

[1,1,2,4,8,16,32,64,128,256,512,...]

Oceniając krytycznie moją znojomość Haskella (czyli: starczy na juniora) - szukałem błędu u mnie. Ale po paru godzinach odpaliłem standardowy kompilator Haskella (GHC) i okazało się, że to chyba jednak Eta ma buga. Czyli dość słabo, bo miałem na ten temat robić pokazy, a tu kompilator wywala się na przykładzie z drugiej strony podręcznika.

I tu zrobiłem jedną dobrą rzecz: zgłosiłem problem autorom. Poszedł dość wyczerpujący opis buga. Potem zaczałem się wgłębiać, gdzie i co się wali (chciałem jakoś pomóc).
Skończyło się 2 zarwanymi nocami - walką ze składnią Haskella, przeglądaniem kodu kompilatora (900 plików w Haskellu, część po kilkaset linii), przeglądaniem kodu pośredniego (STG), wygenerowanego bytecodu i po dodatkowych poprawkach i review autora ... Pull Requestem, który właśnie wlazł do mastera. (JUHU)
W miedzyczasie właziłem na Codingame i się douczałem...

Nie miała z tego wyjść reklama codingame , ale zrobili dobrą robotę i naprawdę mi pomogło (ogarnąłem IO Monad i składnie).

Mimo, że kod w Haskellu to same krzaczki (z punktu widzenia Javowca) to IMO jest dużo przyjemniejszy od kodu websphere czy wielu systemów JavaEE. Jednak nikomu nie przyszło do głowy pisać w Haskellu takie kilkutysięczniki, jak niektórym Agile zespołom Javowym naturalnie wychodzą. Z drugiej strony Haskellowcy, mimo, że mają dobry język ... mogliby czasami, w szczególnych okolicznościach ... khem: pisać testy. Chociaż jeden na projekt by się przydał. Też testu automatycznego, nie dodałem, bo nawet nie wiem jak - to następny punkt na liście do ogarnięcia.

jarekr000000

@WhiteLightning: tak. I poprawie nazwę, bo źle pisałem.

Hispano-Suiza

To się nazywa pasja! To kiedy ten przekreślony vlog? :-)

trojanus

niektórym piwo najwyraźniej nie smakuje :)

Afish

Muszę zapamiętać, żeby kijem nie dotykać technologii, która na takim przykładzie się wykłada. Enterprise ready, nie ma co.

jarekr000000

@Afish: ktoś te technologie musi zrobić ready :-) Btw. sam haskell (zwykły GHC) w biznesie jest od dawna. Działa. Jeszcze niedawno śmialismy się, że z haskella żyje około 100 programistów na świecie.. ale ostanie lata dużo zmieniły.

Afish

Spoko, niech robią, ale jeżeli wyłożyli się na takim prostym kodzie, to trochę mniej wierzę, że ogarną skomplikowane rzeczy. To jak z arytmetyką, jak ktoś pomyli się w dodawaniu, to może i uda mu się scałkować, ale jakoś mniej prawdopodobne mi się to wydaje.

jarekr000000

@Afish z perspekywy czasu 2000 rok i wersja 1.3 javy to ta co zawojowała świat ecommerce i banków.. .a takie kwiatki miała https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4385404 (kod podobnie skomplikowany jak ten w haskellu - tylko język bardziej rozwklekły).

Afish

Nie ma znaczenia, czy technologia zawojowała świat, wszyscy teraz używają JavaScriptu, ale to nie zmienia faktu, że najlepiej się do niego nie zbliżać.

Hispano-Suiza

@Afish: Po co zatem dotykasz C#? :-D

Afish

@Hispano-Suiza: Żeby zarobić na życie.

Fedaykin

@jarekr000000: No tak, teraz jest ich już 150 ;)

zarazek

Szacun! A jak tam sama Eta? Da się jej używać? Dla mnie killer ficzerem Haskella są różne bajery do współbieżności, np. STM, a tego chybanie ma?

rubaszny_karp

Osobiście uważam że wszystko poza Javą powinno zostać ustawą zakazane - ale szacun !

mr_jaro

@rubaszny_karp: osobiście uważam że java nigdy nie powinna powstać ale... już trudno.

rubaszny_karp

dobra, widzę że tej karuzeli śmiechu już nie powstrzymamy https://www.youtube.com/watch?v=ybc157gBVxY

rav3n

Pora na Haskell Enterprise Edition by @jarekr000000 ;)

jarekr000000

@zarazek eta ma też cel aby wszystko albo prawie wszystko z hackage działało... wiec po prostu STM najlepiej sprawdzić. Akurat w tym względzie są nieźli - w sensie całkiem dużo już pakietów (nawet dzikich) sprawdziłem i działają bez poroblemu.