Haskell
Zależności Funkcyjne w Haskellu
Spytano mnie raz, co jest trudnego w Haskellu, co jednocześnie jest łatwe w OOP. Np. stworzenie interfejsu kolekcji i danie możliwości implementowania go klientom-użytkownikom. W tym celu potrzebujemy Klasę Typu od dwóch parametrów. Ale żeby mieć dobry interfejs, to nie wystarczy. O czym się przekonaliśmy w artykule Abstrakcja i dopasowanie do wzorców.
Złote testy w Haskellu
Zainspirowany wpisem o złotych testach na 4programmers postanowiłem dodać je do swojego projektu w Haskellu.
Abstrakcja i dopasowanie do wzorców w Haskellu
Po hermetyzacji i abstrakcji RAMu dla interpretera HelMA pora na stos. Stos, zwłaszcza stos arytmetyczny, jest strukturą używaną w wielu interpreterach jezyków ezoterycznych. Więc warto wydzielić tą abstrakcję do osobnego modułu.
Abstrakcja w Haskellu, czyli klasy typów
Po Hermetyzacji pora na Abstrakcje. Abstrakcja ma w programowaniu wiele znaczeń. Jednak w tym artykule będzie mi chodzić o abstrakcję spotykaną w OOP, czyli interfejsy (w Javie), traity (w Scali) czy klasy czysto abstrakcyjne (w C++). Czy Haskell ma odpowiednik interfejsów/traitów? Tak są to klasy typów (ang. Type Classy). Dzięki nim możemy wybierać implementację podczas działania programu.
Hermetyzacja w Haskellu
Hermetyzacja to cecha charakterystyczna obiektowych języków programowania. Co jednak nie znaczy, że hermetyzacja nie istnieje w Haskellu. Hermetyzację podobną do klas z języków OOP osiąga się w Haskellu za pomocą modułów i jawnego eksportowania funkcji i typów.
Alternatywy dla Prelude w Haskellu
Haskell jest pięknym językiem programowania, ale nie jest doskonały. Haskell posiada wiele błędów projektowych. Biblioteka standardowa Haskella też nie jest idealna. Prelude jest zbiorem domyślnie importowanych modułów w Haskellu z biblioteki standardowej. Niestety prelude importuje wiele niebezpiecznych oraz powolnych funkcji. Jednocześnie nie importuje wielu użytecznych funkcji.
5 języków programowania, które warto znać będąc już programistą
Jakiś czas temu na https://4programmers.net pojawiło się stwierdzenie: Ostatnio oglądałem wypowiedź twórcy języka C++, gdzie Bjarne Stroustrup powiedział, że zna ponad 20 języków programowania w przynajmniej podstawowym stopniu, dodał, że dobry programista powinien znać bardzo dobrze przynajmniej 5 języków, aby potrafił spojrzeć na problem z różnych perspektyw. Jaką piątkę wy byście wybrali, w jakiej kolejności i dlaczego?
Funktor, Monada i Aplikatywa w Haskellu
Trzy klasy typów Funktor, Monada i Aplikatywa są to prawdopodobnie trzy najpopularniejsze klasy typów do przetwarzania danych.
Problem wywołań cebulowych w Haskellu
Przez Problem wywołań cebulowych rozumiem sytuację zagnieżdżonego wywoływania różnego rodzaju funkcji jak: someFunction someData = thirdFunction (secondFunction (firstFunction someData))
Attoparsec i EAS
W poprzednim artykule attoparsec zdefiniowałem cele napisania prostego asemblera z języka EAS do ezoterycznego języka programowania ETA. W tym artykule przyszła pora na implementację.
Wyrażenia regularne kontra parsery
Wyrażenia regularne słyną z tego, że są trudne i mało czytelne. Czy są dla nich jakieś alternatywy? Tak, są to parsery.
Parsowanie parametrów wiersza poleceń w Haskellu
Prawie każdy program, który można wywoływać z wiersza poleceń (ang. Command Line Interface, CLI), a interpreter jak HelMA w szczególności, musi posiadać obsługę parametrów (ang. Options) przekazywanych z wiersza poleceń. Obsługę taką można napisać samodzielnie albo z pomocą dedykowanej bibliotek. Ja zdecydowałem się na bibliotekę optparse-applicative. Biblioteka ta posiada szereg zalet. Między innymi można jej używać w eta-lang.
Testy jednostkowe i mockowanie wyścia-wejścia w Haskellu
Testy pisać trzeba, to oczywiste. Pozostaje pytanie jednostkowe czy integracyjne? Ja na razie zdecydowałem się na jednostkowe, co postawiło mnie przed kolejnym pytaniem jak przetestować kod używający wyjścia-wejścia w Haskellu? To znowu sprowadza się do pytania jak zamockować monadę IO w Haskellu?
Haskell i klasy typów Show
oraz Read
Wiele osób zadaje takie pytanie: Co napisać w nowym języku programowania, żeby się go nauczyć
Sześć rodzajów polimorfizmu - polimorfizm jakiego nie znamy z OOP
Wydawałoby się, że trzy rodzaje polimorfizmu, jakie są spotykane w obiektowych językach programowania i które opiswałem w artykule Sześć rodzajów polimorfizmu - polimorfizm jaki znamy z OOP, są wszystkim czego potrzebujemy do szczęścia, żeby pisać zwięzły kod. Czasem pojawi się tylko jakiś zgrzyt, gdzie trzeba zaimplementować wzorzec wizytator lub fakrykę.
Haskell i monady - czy monady są jeszcze egzotyczne?
Język programowania Haskell to ma straszną opinię. Że trzeba rozumieć co to teoria kategorii albo monady. Tylko że teoria kategorii odnosi się do wszystkich języków programowania. A monady są podobno możliwe nawet w Bashu. Gdy tak mówię lub piszę, ludzie mi nie wierzą. Ostatnio z tego powodu dostałem kod w Haskellu, który wyglądał mniej więcej tak:
No Exceptions - IO, królowa monad
Czasem słyszy się opinie, że programowanie funkcyjne jest bez sensu, ponieważ czyste funkcje (ang. pure functions) nie pozwalają na pisanie efektów ubocznych. A przecież każdy działający program potrzebuje efektów ubocznych. Dla wyjaśnienia efektem ubocznym jest: Komunikacja ze światem zewnętrznym, zarówno odczyt jak i zapis Komunikacja między wątkami Zmienny stan (ang. mutable state) i zmienne kolekcje (ang. mutable collections)
No Exceptions - problemy z biblioteką standardową i biblioteki zewnętrzne
To jest trzecia część cyklu o walce z wyjątkami w Scali. Zobacz część pierwszą i drugą.
No Exceptions - problemy z wyjątkami i biblioteka standardowa
To jest druga część cyklu o walce z wyjątkami w Scali. Zobacz część pierwszą.
No Exceptions - o problemach z wyjątkami
Wyjątki bywają problematyczne, ale przez swoich obrońców, są często przedstawiane jako jedna z fundamentalnych części programowania obiektowego. Co ciekawe wyjątków nie ma w podstawowych założeniach paradygmatu obiektowego. Nie ma też nic o wyjątkach w definicji programowania obiektowego podanej przez Alana Kaya, lider zespołu tworzącego język Smalltalk uznawany za twórcę tego terminu. Za to jest o komunikowaniu się obiektów za pomocą wiadomości.
Kolejny język programowania - język wszystkomający
Język wszystkomający jest to język w którym można programować imperatywnie, funkcyjnie, obiektowo, proceduralnie oraz strukturalnie. Prawdopodobnie jest to język zły do nauki jako pierwszy język programowania. Może też być złym językiem do nauki pojedynczych paradygmatów programowania, jeśli nie mamy odpowiedniej dyscypliny. Jeśli jednak mamy tę dyscyplinę jest to genialny język do nauki nowych paradygmatów programowania. Po co uczyć się nowych paradygmatów programowania starałem się wyjaśnić w artykule Kolejny język programowania do nauki - paradygmaty programowania.
Kolejny język programowania do nauki - paradygmaty programowania
Zdecydowaliśmy się nauczyć programować. I zostać programistami. Może nawet dostaliśmy pierwszą pracę. I w tej pracy ktoś nam powiedział, że uczy się nowego, a więc i kolejnego, języka programowania. Czemu się uczy? Bo np. usłyszał/przeczytał cytat:
Który język programowania wybrać na początek - język natywny
Wiele osób pyta się, który język programowania wybrać na początek jako pierwszy język do nauki. Wiele jednak zależy od tego do czego chcemy użyć tego języka programowania. Dlatego wybrałem zwycięzców w czterech kategoriach: dynamicznie typowany język skryptowy ogólnego przeznaczenia statycznie typowany język korporacyjny używany do pisania długowiecznych aplikacji klasy enterprise język fullstackowy, który można używać do pisania frontendu i backendu szybki język natywny działający bez maszyny wirtualnej i interpretera
Który język programowania wybrać na początek - język fullstackowy
Wiele osób pyta się, który język programowania wybrać na początek jako pierwszy język do nauki. Wiele jednak zależy od tego do czego chcemy użyć tego języka programowania. Dlatego wybrałem zwycięzców w czterech kategoriach: dynamicznie typowany język skryptowy ogólnego przeznaczenia statycznie typowany język korporacyjny używany do pisania długowiecznych aplikacji klasy enterprise język fullstackowy, który można używać do pisania frontendu i backendu szybki język natywny działający bez maszyny wirtualnej i interpretera
Który język programowania wybrać na początek - język korporacyjny
Wiele osób pyta się, który język programowania wybrać na początek jako pierwszy język do nauki. Wiele jednak zależy od tego do czego chcemy użyć tego języka programowania. Dlatego wybrałem zwycięzców w czterech kategoriach: dynamicznie typowany język skryptowy ogólnego przeznaczenia statycznie typowany język korporacyjny używany do pisania długowiecznych aplikacji klasy enterprise fullstack język, który można używać do pisania frontendu i backendu szybki język natywny działający bez maszyny wirtualnej i interpretera
Functional Miners - Programowanie Funkcyjne dla Każdego
2019-05-21 odbyło się spotkanie Functional Miners (@fun_miners) w HackerSpace Silesia (@hs_silesia) o tematyce Programowanie Funkcyjne dla Każdego. Wydarzyły się dwie prezentacje: Wojciech Gawroński - Functional Programming in the Wild Andrzej Spiess - From \x.x to Facebook - Introduction to Lambda Calculus
Krótki opis konstrukcji kompilatorów GCC, LLVM i Clang
W dawnych czasach każdy dobry programista chciał napisać swój własny kompilator języka C. Co prawda te czasy już minęły i dziś większość z nas programuje w językach o wiele bardziej złożonych niż C. Dzięki czemu jesteśmy w stanie pisać szybciej kod. Ale nadal warto znać podstawy budowy kompilatorów. Na szczęście konstrukcja kompilatora jest prosta jak konstrukcja dzidy bojowej. Dzida bojowa składa się z: przeddzidzia dzidy bojowej śróddzidzia dzidy bojowej zadzidzia dzidy bojowej.
Scala - No Universal Equality
Ostatnim błędem zgłaszanym w kodzie projektu resentiment przez scalafix jest “No Universal Equality” wynikający z użycia operatora ==.
Bardziej dynamiczna analiza kodu dla języka Scala - Property-based testing
Testy modułowe (jednostkowe) napisane w poście Dynamiczna analiza kodu dla projektu resentiment zawiodły. Mimo posiadania 100% pokrycia kodu dla klasy Calculator klasa ta nie działała w sposób poprawy.
Przenośna Scala
Znajomy zajarał się językiem Rust. Opowiada mi jaki to wspaniały język i pokazuje przykłady kodu. Rust na pierwszy rzut oka wygląda jak skrzyżowanie C i języka Haskell plus kanały jak w języka Go. Czyni go to pretendentem do bycia najbardziej skomplikowanym językiem programowania na świecie. Pretendentem, bo istnieje wśród programistów JVM opinia, że najbardziej skomlikowanym językiem na świecie jest Scala. Scala jest skrzyżowaniem Javy i Haskella plus aktory z języka Erlang.
Linki zewnętrzne
- Twitter: @haskell_lang
- Strona domowa
- Wikipedia
- Wikibooks
- Learn Haskell in Y minutes
- wazniak.mimuw.edu.pl:
- Programowanie w Haskellu
- Pięć sposobów na… silnię w Haskellu!
- Learn You a Haskell for Great Good!
- What I Wish I Knew When Learning Haskell
- Implementing a JIT Compiled Language with Haskell and LLVM
- Building a modern functional compiler from first principles.
- Declaration vs. expression style
- Why Haskell Matters
- Write Yourself a Scheme in 48 Hours
Niestandardowe implementacje i dialekty
- Eta - kompilowana do kodu bajtowego Javy
- Frege - transpilowany do Javy
- Hamler - kompilowany do kody bajtowego Erlanga
- PureScript - transpilowany do JavaScriptu, bez domyślnej leniwości wszystkich wyrażeń
- Elm - transpilowany do JavaScriptu, inspirowany także językiem ML
- Idris - Haskellopodobny język z typami zależnymi, które można użyć do dowodzenia twierdzeń
- Kind - Haskellopodobny język z dowodzeniem twierdzeń
- Rust - niskopoziomowy Haskellopodobny język