Programowanie funkcyjne - Haskell, Lisp etc.

Programowanie funkcyjne - Haskell, Lisp etc.

Wątek przeniesiony 2021-03-22 10:23 z Nietuzinkowe tematy przez cerrato.

RA
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:17
1

O co ten cały szum z programowanie funkcyjnym? Dla mnie naturalne rozumienie komputera to programowanie imperatywne (chyba że deklaratywny SQL). Rozumiem, że są przydatne elementy programowania funkcyjnego w JavaScript czy Javie. W korporacjach można też stosować różne immutable struktury. Ale jakie jest zastosowanie języków prawdziwie funkcyjnych jak Haskell czy Lisp w realnej gospodarce? Czy są to języki od dziesięcioleci wyłącznie badawcze na uczelniach, formalizmy matematyczne do rozwiązywania prostych zagadek, czy mają albo mogą mieć w przyszłości jakieś praktyczne zastosowanie?

stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:36 minut
0


λλλ
edytowany 3x, ostatnio: stivens
V6
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:<a href="https://megatool.pl">sklep</a>
  • Postów:49
2

Nie znam sie, ale wypowiem. Niektóre algorytmy są bardzo wygodne implementacji w językach funkcyjnych. Generalnie algorytmy rekurencyjne bardzo fajnie się pisze funkcyjnie. a potem np można stosować elementy z f# w c# co też jest bardzo spoko.


PL
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:104
2

Powiem wam tylko tyle że podczas kompilacji kod Haskella przekształcany jest do języka C. W kolejnej fazie kompilator C tworzy plik wynikowy. Wydaje się wam, że to Haskell a to jest specjalna wersja języka C...

SA
  • Rejestracja:około 12 lat
  • Ostatnio:około godziny
  • Postów:1430
6
randomowy napisał(a):

Dla mnie naturalne rozumienie komputera to programowanie imperatywne (chyba że deklaratywny SQL).

Tylko tak Ci się wydaje, bo nauka programowania u każdej znanej mi osoby zaczyna się od programowania imperatywnego. To, że potrafisz tak rozumować nie znaczy, że jest to naturalne - po prostu masz z tym większe doświadczenie. Imperatywność jest naturalna dla maszyny, nie dla człowieka.

ple napisał(a):

Powiem wam tylko tyle że podczas kompilacji kod Haskella przekształcany jest do języka C. W kolejnej fazie kompilator C tworzy plik wynikowy. Wydaje się wam, że to Haskell a to jest specjalna wersja języka C...

XD A C to specjalna wersja asemblera, podobnie jak większość języków.

somekind
Imperatywność jest naturalna dla maszyny, nie dla człowieka. - czy ja wiem? Gdy ludzie coś robią, to też działają w sposób imperatywny, pewnie dlatego łatwiej nam zrozumieć imperatywne języki.
Ktos
Chyba, że matematycy, ale nie wiem czy możemy mówić na nich "ludzie".
M9
Programowanie funkcyjne nie jest pod każdym względem deklaratywne. Wydaję mi się, że paradygmaty czysto deklaratywne są bardziej zrozumiałe od tych imperatywnych. Patrz Constraint Programming
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:10 dni
3

Programując funkcyjnie łatwo utrzymać porządek w kodzie. Jak masz czystą funkcję, łatwiej jest określić czy jest poprawna czy nie. Poza tym, ułatwia to zrównoleglanie kodu.


KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 2 godziny
  • Postów:2964
3

Serwis lichess.org jest napisany w Scali i działa wybornie w porównaniu z chess.com, który jest napisany w cholera-wie-czym, więc domniemuję, że w funkcyjności jest jakaś wartość dodana. Natomiast należy wiedzieć kiedy warto a kiedy nie warto stosować.

Programy funkcyjne łatwiej się analizuje, bo masz tak jakby jeden wymiar mniej - nie jest istotna kolejność wykonania operacji, a jedynie ich wzajemne zależności. Zrównoleglanie też zwykle przychodzi łatwiej. Natomiast z drugiej strony trudniej o dobrą wydajność (w sensie wydajności z jednego rdzenia). Struktury niemutowalne zwykle wprowadzają znaczny narzut w porównaniu z odpowiednikami mutowalnymi.

Zobacz pozostały 1 komentarz
stivens
Struktury niemutowalne zwykle wprowadzają znaczny narzut w porównaniu z odpowiednikami mutowalnymi. - wez pod uwage persistent data structures. Oczywiscie to wszystkich problemow nie rozwiazuje. Np. quicksort jest lepszy na mutowalnej pamieci ale uwaga: da sie to zrobic w Haskellu (masz chwilowa mutowalnosc ale jak skonczysz operacje to zwracasz niemutowalna strukture).
KR
Pisałem właśnie o persistent data structures. Np. żeby zmienić element wektora persystentnego, to musisz skopiować kawałek drzewa, a zatem zrobić choćby alokację dynamiczną. To trwa dużo dłużej niż zwykły zapis w wektorze mutowalnym.
stivens
Ah, ok. Ludzie czesto mysla jednak o read-only i kopiowaniu calosci. To co mowisz jest oczywiscie problemem jezeli mamy ogromne drzewa i oczekujemy niskiego opoznienia. Dlatego taki jezyk C w 2021 wciaz ma duzo sensu przez swoj use-case ale Java juz imho zyje sila bezwladnosci.
Silv
Serwis lichess.org jest napisany w Scali i działa wybornie w porównaniu z chess.com, który jest napisany w cholera-wie-czym (…) – no dobra, ale dla mnie to nie znaczy, że lichess.org musi być napisany funkcyjnie, ani że chess.com nie może być tak napisany…
SA
Ja też bym tutaj nie szukał źródła sukcesu w technologii, myślę, że większy wpływ ma to, że lichess jest open source'owy.
M9
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:42
1

Programowanie funkcyjne nadaje pewne właściwości funkcją, skopiuje je z książki dla ułatwienia:
They are idempotent
They offer referential transparency
They are memoizable
They can be lazy
They’re easier to reason about
They’re easier to combine
They’re easier to test
They’re easier to debug
They’re easier to parallelize

Skoro funkcja X nie zapisuje stanów wewnętrznych i nie odczytuje ich (np zmienna klasy, funkcja rand(), odczytywanie z pliku) oznacza to, że wynik funkcji X będzie zawsze taki sam. Bo polega ona tylko na swoim wewnętrznym stanie. Dzięki temu zachodzi np. właściwość referential transparency

Skoro funkcja X nie zapisuje stanów wewnętrznych i nie odczytuje ich, oznacza to, że nie mamy powodu wywoływania ją póki nie będziemy potrzebować jej wyniku, więc zróbmy ją lazy

Skoro funkcja X nie zapisuje stanów wewnętrznych i nie odczytuje ich, oznacza to, że nie da się napisać tak funkcji, żeby miała sens i zwracała void, tzn

Kopiuj
void func(String s) {
 //wpisz coś do tej funkcji sensownego, że nie zapisuje stanów wewnętrznych i nie odczytuje ich, ale ktoś nadal będzie potrzebował tej funkcji (funkcje haczyki się nie liczą)
}

nie ma takiej funkcji, oznacza to, że wystarczy przetestować co funkcja zwraca (czy to testy manualne czy jednostkowe). Dodatkowo, takie testy jednostkowe będą nastawione na zwracany stan nie behawioralność funkcji

ITP ITD

Silv
*funkcją -> funkcjom
99xmarcin
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:2420
1

W przeszłości były podejmowane próby komercjalizacji e.g. https://en.wikipedia.org/wiki/Lisp_machine, jak widzisz nie bardzo to wypaliło.

Osobiście uważam że języki czysto funkcyjne (zwłaszcza Haskell) są tworzone przez oszołomów matematyków, dla których czytelność kodu czy cała otoczka inżynieryjna projektu (unit testy, benchmarki, system build'u i zarządzania zależnościami, IDE, debuggery, lintery itp). nie istnieje. Jeżeli już takie języki miały by gdzieś znaleźć zastosowanie to raczej w firmach typu Google, ale te w przekorny sposób stawiają na sprawdzone w boju technologie typu Java i C++ (a ostatnio także Go). Facebook używał Ocamla do tworzenia kompilatorów swojego Hack'a ale to też bardziej sfera badań i rozwoju.

Nota bene warto również zauważyć ze czysto obiektowe języki typu Smalltalk również się nie przyjęły. W przypadku SmallTalk'a powód był podobny, zapomniano o współpracy z istniejącymi bibliotekami, kod nie był traktowany jako tekst (Class Browser), deployment był dziwny (trzeba było wgrywać obraz maszyny wirtualnej SmallTalka).

Z drugiej strony "brzydkie" języki programowania, które nie mają oporów przed dodawaniem pragmatycznych funkcjonalności jak JS, Java i C++ mają się bardzo dobrze...

W sumie dla mnie jedyny "czysto" funkcyjny język który ma jako takie szanse na szerszą adopcję to F# (Scala to raczej chimera FP i OOP).

PS. Warto jeszcze popatrzeć na zmianę języka z punktu widzenia biznesu. Dawno dawno temu przejście assembler -> prog. strukturalne dawało olbrzymie zyski z produktywności i spadek liczby błędów. Potem nastąpiła długa era panowania C i Pascala aż w końcu dotarliśmy do ściany o nazwie duże projekty z olbrzymią (jak na tamte czasy) liczbą programistów i linii kodu. C bez przestrzeni nazw, paczek itp. nie pozwalał w wydajny sposób zarządzać dużymi bazami kodu. I tak na scenę wtoczył się C++ zapewniając właśnie to, ładne grupowanie metod w obiekty. Rozszerzało to znacznie przestrzeń nazw bo teraz 100 obiektów mogło mieć metodę add i nie było żadnych konfliktów. Potem projekty nadal rosły, na scenie pojawił się internet - jest to moment wzrostu znaczenia języków skryptowych takich jak Perl i potem PHP które oferowały dużą produktywność w pracy z siecią Web. Moment ten wykorzystała też Java, rozwiązując po stronie backendu problemy C++ - to jest brak biblioteki standardowej + GC.
FF 20 lat i jesteśmy w 2021, czy istnieje obecnie język FP który ma killer feature? Wydaje mi się że nie. Kilka lat temu wydawało się że takim killer feature'em będzie programowanie równoległe ale zarówno C# jak i Java rozwiązały ten problem za pomocą bibliotek (do tego doszło programowanie reaktywne).

Powyższe rozumownie wyjaśnia też dlaczego np. Kotlin ma takie trudności z adopcją. Biznes nie zmieni języka tylko dlatego żeby programistom się lepiej pisało (a przynajmniej nie do czas aż Ci masowo zaczną składać wypowiedzenia lub będzie bardzo duży problem z rekrutacją nowych ludzi). Żeby nastąpił zmiana nowy język musi dostarczać czego co zagwarantuje olbrzymi wzrost produktywności. Ostatnią taką rzeczą była chmura. Można się zastanowić czy w językach programowania taki wzrost jest jeszcze w ogóle możliwy?


Holy sh*t, with every month serenityos.org gets better & better...
edytowany 2x, ostatnio: Shalom
Zobacz pozostałe 9 komentarzy
stivens
Jak Kotlin moze miec zadatki do bycia nastepnikiem Javy to F# jest czyms zupelnie ortogonalnym do C#.
99xmarcin
Podałem F# jako odpowiednik Scali v JVM.
stivens
Wciaz nie pasuje
stivens
Rodzina ML jest zreszta starsza od C# czy Javy
Silv
@0xmarcin: Podoba mi się analiza historyczna.
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:39 minut
  • Postów:3540
2
randomowy napisał(a):

O co ten cały szum z programowanie funkcyjnym? Dla mnie...

Dla ciebie może i tak, dla coraz większej liczby osób nie.

Ale jakie jest zastosowanie języków prawdziwie funkcyjnych jak Haskell czy Lisp w realnej gospodarce?

Nie wiem jak z Haskellem czy LISPem, ale modele event-based (czyli bardzo duża część gospodarki, od czujników zaczynając) są czymś naturalnym dla programowania funkcyjnego, natomiast w modelu imperatywnym trzeba tworzyć różne dziwne fikołki.

99xmarcin
Ciekawe co mówisz, bo np. spora część narzędzi zbierających punkty danych np. prometheus jest pisana imperatywnie ze względu na wydajność.
W0
Oczywiście, że dużo rzeczy jest napisanych w ten czy inny sposób ze względów wydajnościowych i temu nie przeczę. Kiedyś ze względów wydajnościowych miałeś dużo softu napisanego w ASM, teraz dzięki rozwojowi technologicznemu - zarówno dzięki wzrostowi mocy, jak i tego, że kompilatory robią się coraz mądrzejsze - większość niskopoziomowych rzeczy jest napisane w C. Podobnie będzie i tutaj.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
7

To może kilka wyjaśnień.

Haskell już od kilku lat nie jest językiem akademickim tylko wlazł do biznesu - nawet do mnie docierają oferty pracy w Haskellu - Polska (Warszawa) lub Zurich głównie.
Scala funkcyjna jest już w biznesie od dawna - można nawet powiedzieć, że przetarła szlaki Haskellowi trochę - otworzyła oczy niedowiarkom.

Dlaczego:
Głównie dlatego, żeby wbrew wszelkim przesądom móc o 15:55 w piątek puścić release na produkcje i spokojnie jechać na narty - nie patrząc nawet na to co leci w konsoli.
Kod funkcyjny, wsparty typami powoduje, że wiele błędów nawet nie da się popełnić (albo trzeba się postarać). Jak się skompiluje to musi działać.
Testów trzeba pisać dużo mniej, bo testujemy zasady biznesowe, a nie czy wszystko razem do kupy działa.

Czyste funkcje się zajebiście i bezproblemowo komponują.
Dla takich staruchow jak ja, którym się nie chce wysilać przy każdej linijce kodu - co też tu moze pójść nie tak - fp jest idealne - kompilator się wysila i robi mi review.
Killer feature fp to właśnie komponowalność, a w związku z tym bezpieczeństwo.

FP przyjęło sie w finansach, blockchain itp. - wszędzie tam, gdzie drobna pomyłka i masowo przelewamy pieniądze nie tym ludziom co trzeba, albo masowo kupujemy po nie tej co trzeba cenie.

Obecnie, co prawda większość kodu piszę w kotlinie, wbrew temu co napisano kotlin nie ma problemu z adaptacją wygryza javę nawet w korporacjach (oczywiście na pewno nie wszędzie), ale przynajmniej piszę funkcyjnie w tym kotlinie (Scala--) (dorobiłem nawet plugin do lintera, który czystość sprawdza).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
Zobacz pozostałe 2 komentarze
99xmarcin
Musze zapytać z ciekawości przez ile lat pracowałeś w czystym FP (zawodowo oczywiście)?
jarekr000000
Zbierze się nieco ponad 2 lata - kilka małych projektów w scali, kilka małych w kotlinie i jedna czysta kobyła kotlinowa (już się zrobiła kobyła). W kotlinie czystość oczywiście na siłe - przez wsadzanie wszystkiego do reactora Flux/Mono. Samej Scali to mniej więcej rok - ale to same projekty po 2-3 miesiące, największy team to 3 osoby, może dlatego kojarzy mi się dobrze :-) W międzyczasie (bo pierwszy sensowny fp projekt zrobiłem z 5 lat temu) obrabiam projekty imperatywne - głównie stare javowe, ale mam też imperatywnego kotlina ostatnio (ech...).
jarekr000000
Oczywiście dochodzi jeszcze kwestia "czystości" - jak pisałem pierwsze rzeczy w Scali to monady czasem traktowałem jako zło konieczne. Mutowania oczywiście nie robiłem, ale efektami tak sobie się przejmowałem - jak framework zapewniał jakieś Task/IO to używałem - nie wiedząc czemu. Jeszcze byłem przez chwilę fanem akki i actorów (a to dość nieczyste). Tak samo, w niektórych zasadniczo czystym projektach w kotlinie mam jakieś nieczyste miejsca - np. współpraca z bibliotekami javowymi.
Potat0x
A jak to jest z szybkością kompilacji Scali w porównaniu do Kotlina? Dużo wolniej?
jarekr000000
@Potat0x: a to jest bardzo śmieszna sprawa, bo mam ostatnio wrażenie, że kompilator Scali zaczął śmigać (było dużo poprawek wydajności), a kotlina jest coraz wolniejszy (tu nawet tłumaczą się wprowadzaniem IR i tym podobnymi). NIe mam dokładnie takiego samego projektu, w jednym i drugim języku więc nie mam jak porównać - ale całość ma element komiczny, bo kotlin powstał jako okrojona scala, za to łatwa i szybka w kompilacji - mam wrażenie, że na małych projektach scala jest teraz szybsza... - ale to może być tylko wrażenie.
99xmarcin
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 miesiące
  • Postów:2420
1

FP przyjęło sie w finansach, blockchain (...)

Rzut okiem na Solidity pokazuje że tego funkcyjnego podejścia tam jednak brakuje: https://docs.soliditylang.org/en/v0.4.21/control-structures.html#scoping-and-declarations

Sam bitcoin naklepany w C++ (no jak oni mogli!): https://github.com/bitcoin/bitcoin a ETH w Go: https://github.com/ethereum/go-ethereum

Z ciekawości NoFluffJobs:

Ofert w Scali jest nieco więcej ale większość to nie programowanie tylko big data. Co ciekawe stawki na stanowiska dla Scalowców (nie big data) mizerne (przykłada od SM: https://nofluffjobs.com/pl/job/mid-java-scala-developer-softwaremill-remote-apn7hgqc widły 11k - 17k, bez szału choć język znacznie bardziej trudny i wymagający). Pokazuje to jak biznes szanuje programowanie funkcyjne.

W erlangu jest nico ciekawiej (https://nofluffjobs.com/pl/jobs?criteria=erlang), w sumie ta oferta od blockfi nawet przykuła moją uwagę. Niemniej widać że funkcyjniaki to < 10% rynku.


Holy sh*t, with every month serenityos.org gets better & better...
edytowany 1x, ostatnio: 99xmarcin
PA
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:426
0
0xmarcin napisał(a):

FP przyjęło sie w finansach, blockchain (...)

Rzut okiem na Solidity pokazuje że tego funkcyjnego podejścia tam jednak brakuje: https://docs.soliditylang.org/en/v0.4.21/control-structures.html#scoping-and-declarations

DAML się ładnie wpasowuje https://daml.com/

https://www.juspay.in/ to jeden z większych graczy w temacie fp.

Generalnie szukanie takiego stosu w pl mija się z celem.

edytowany 1x, ostatnio: part
99xmarcin
Hmm... ciekawe o Solidity i Strip'ie słyszalem, o DAMLu i Justpay nie... Tak czy siak mój post miał uzmysłowić że obszar finansów jest jednak zdominowany przez języki nie-funkcyjne.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Świetnie, że wytrzasnąłes solidity, ale czego to dowodzi? Czy to nie w solidity ktoś się kiedyś rypnął i stąd mamy split w Ethereum?
Jest również ileś funkcyjnych w okolicy smart contracts - ostatnio obiłem się o daml.

https://github.com/digital-asset/ex-bond-issuance/blob/master/src/main/daml/DA/RefApps/Bond/Redemption.daml

Co do stawek to pełna racja - obecnię pracuje z dodatkiem za szkodliwe warunki pracy (czyli okazyjne potykanie się o javę i imperatywnego kotlina).

Paradoksalnie jeszcze grzebie czasem w TS, który jeśli się używa Reacta to potrafi być zupełnie czysto funkcyjny i nawet przyjemny.

Oferty na Haskell czy Scala są faktycznie słabsze, więcej dobrych ludzi chce w tym pracować i godzi się na niższe pensje (jak trafię kiedyś jeszcze na dłużej do jakiegoś Springa lub czegoś podobnego to też taki krok przemyśle).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
Zobacz pozostałe 8 komentarzy
99xmarcin
@stivens: wiesz dobrze że chodzi mi o filozofię i to algebraiczne podejście do programowania w haskellu. Język jest zwarty niczym notacja matematyczna i niestety tak samo prosty i "przyjemny" w odbiorze. @jarekr000000 "commit i rollback piszesz raz i już się nim nie przejmujesz" i dosłownie tak samo możesz to zrobić w Javie.
jarekr000000
@0xmarcin: zapewniam cię, że Haskellowiec jak czyta javę to też wysiada - jak tylko zobaczy x=x+1 (co to k...a jest?).
jarekr000000
@0xmarcin: tak jak pisałem ten commit i rollback w javie tylko raz to działa jak przejdziesz w programowanie funkcyjne i nadal nie jest tak wygodny w komponowaniu, ani bezpieczny jak haskellowy odpowiednik, głównie przez efekty uboczne, które jednak możesz sobie wszędzie wrzucić, wszystko może łatwo wyciec - np. connection można sobie nawet niechcący wystawić na zewnątrz takiego doInTransaction()).
99xmarcin
@jarekr000000: a ile razy widziałeś faktycznie w projekcie ze ktoś wstawił connection na zewnątrz? To raczej są problemy typowe dla ORMów i trackowania encji a nie problemy z nie-funkcyjnymi językami. Nikogo nie trzeba przekonywać w 2021 że Hibernate to broń obusieczna, dostajesz coś, coś musisz dać w zamian. Ostatnie kilka lat to zwrot w kierunku mikro ORMów.
jarekr000000
@0xmarcin: nie widziałem ani razu, żeby ktoś connection wypuścił. Hibernate dramaty oczywiście widziałem wielokrotnie - np. tworzenie parent-child, gdzie oba obiekty pochodzą z różnych sesji (to jest miodzio). Widziałem wielokrotnie dane przerzucane pod stołem przez ThreadLocal (czy RequestScoped), widziałem wielokrotnie zjebki wynikające z mutowania kolekcji. Zjebek Springowych całą masę. Trochę zrypek na reactorze - brak subscribe - tu java ssie. Oczywiście wiele z tego można uniknąc pisząc w javie funkcyjnie - tyle, że to męczące i dobrze nie wygląda.
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
2

Struktury niemutowalne zwykle wprowadzają znaczny narzut w porównaniu z odpowiednikami mutowalnymi.

@Krolik Niby tak, ale w praktyce:

  1. Kolekcje w kodzie biznesowym sa małe
  2. Często i tak list, tablic etc nie zmieniasz. Np. jak ładujesz 20 pierwszych operacji z histori karty to będziesz dalej przepychał te 20 operacji do frontendu czy jakiegoś SOAPA ;)
  3. Można stosować lokalne mutowanie, nawet "ukryte". Np. jak masz Collector w Javie który tworzy kolekcję ze strumienia to możesz stosować lokalnie mutowalny buildier ArrayList a zwróci Ci niemutowalną kolekcję
  4. W praktyce największym kosztem są operacje IO, głównie bazodanowe i nieumiejętne stosowanie albo po prostu stosowanie ORM i np. wczytanie całych encji mimo że potrzebujesz 3 pól z 20, albo N+1.
    Dodatkowo refleksja o którą oparte są runtimowe frameworki też jest kosztowna pod wzlędem czasu.

hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:12 dni
5

No FP ma trochę zastosowań:

  • Lispy
    • gamedev (Naughty Dog)
    • webdev (kiedyś Reddit, Hacker News)
    • grafika/projektowanie (AutoCAD, GIMP)
    • sysops (Puppet, Guix)
    • testowanie (Jepsen)
  • BEAM (Erlang, Elixir i ferajna)
    • komunikacja (ejabberd, Discord, WhatsApp)
    • e-commerce (PepsiCo, Klarna)
    • hazard (bet365)
    • bazy danych (RabbitMQ, Mnesia, Riak, CouchDB, BarrelDB)
    • testowanie (QuviQ QuickCheck)
    • telco (Ericsson, Cisco)
  • ML
    • dowodzenie i weryfikacja (Coq, Isabelle)
    • generowanie kodu (FFTW)
    • implementacja języków (Coq, Haxe, Hack, ReasonML)
    • analiza statyczna programów (Infer, Frama-C, Flow)
  • Haskell
    • parsery (Pandoc, Corrode)
    • statyczna analiza (ShellCheck)
    • systemy kontroli wersji (git-annex, Darcs)
    • webdev (PostgREST)

edytowany 1x, ostatnio: hauleth
Zobacz pozostałe 2 komentarze
hauleth
Dodałem telco do BEAM.
WeiXiao
webdev (kiedyś Reddit, Hacker News) nie wiem czy jakbym reklamował coś jako "Web-dev" ready to podawałbym przykład HNa i Reddita :D HN dalej zapisuje posty do plików?
hauleth
@WeiXiao: a to coś złego?
WeiXiao
@hauleth: nie wyglądają one zbyt imponująco i nie mowie o wyglądzie, a np. to tym, że paginacja jest robiona przez moderatora :O, który od kilku lat wspomina że Threads are paginated for performance reasons (yes we're working on it), so to see the rest of the comments you need to click More at the bottom of the page, or like this:
hauleth
@WeiXiao: jak wolisz, to masz CircleCI, które ma UI w ClojureScript czy Mail Online, które jest w Clojure. Ogólnie z webdevem jest o tyle trudno, że często masz tam wiele języków (zwłaszcza przy mikroserwisach) i nie wszyscy się chwalą czego używają.
V-2
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:671
2

Ja to widzę tak. Języki funkcyjne w pewnym sensie przydeptują swój własny wąż z tlenem.
Ich problem polega właśnie na tym, że ich zalety są doceniane. O co chodzi?
Współczesne języki głównego nurtu są w dużym stopniu hybrydowe.
To znaczy - w wielu już teraz popularnych językach można sobie pisać w miarę funkcyjnie (Scala, Kotlin, C#). I ten trend raczej się nasila, niż słabnie.

No to po co ktoś ma przestawiać się na język silniej związany z nurtem FP - jak na przykład F# - skoro co lepsze kąski i tak wpadną mu do C#?

Purystom to oczywiście nie wystarczy, ale purystów zawsze jest mało.


Nie ma najmniejszego powodu, aby w CV pisać "email" przed swoim adresem mailowym, "imię i nazwisko" przed imieniem i nazwiskiem, ani "zdjęcie mojej głowy od przedniej strony" obok ewentualnego zdjęcia. W drugiej firmie której już pracuję mam palących marihuanę programistów [...] piszą kod "leniwie", często nie wysilając się, rozwlekając ten kod, unikając np. programowania funkcyjnego (mówię tutaj o lambdach w javie).
edytowany 1x, ostatnio: V-2
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:36 minut
2

To znaczy - w wielu już teraz popularnych językach można sobie pisać w miarę funkcyjnie (Scala, Kotlin, C#). I ten trend raczej się nasila, niż słabnie.

Ty chyba nie wiesz co to FP jesli wymieniasz tutaj C#.

Podpowiem: FP nie polega na pisaniu lambd.

EDIT: to znaczy nie jest to warunek wystarczajacy ani nawet konieczny * ;)


λλλ
edytowany 4x, ostatnio: stivens
KamilAdam
Taki mały fun-fakt - C# posiada specjalną składnię do składania monad. Tylko że monady nie mają tam metody bind czy flatMap a ManySelect. A ta składnia do składania monad nazywa się LINQ :D
PA
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:426
0
V-2 napisał(a):

Ich problem polega właśnie na tym, że ich zalety są doceniane. O co chodzi?
Współczesne języki głównego nurtu są w dużym stopniu hybrydowe.

Ludzie po prostu odkryli na nowo, że w oop też możesz mieć lambdy. Właściwie zatoczyliśmy koło smalltalk -> java -> statycznie typowany smalltalk.

No to po co ktoś ma przestawiać się na język silniej związany z nurtem FP - jak na przykład F# - skoro co lepsze kąski i tak wpadną mu do C#?

Na F# po nic, bo akurat w nim programowanie obiektowe jest jedyną opcją. Nie ma funktorów z ocamla, nie ma type classes, nie ma nic... Już C++ ma więcej możliwości do budowania funkcyjnych abstrakcji.

edytowany 1x, ostatnio: part
somekind
Na F# po nic, bo akurat w nim programowanie obiektowe jest jedyną opcją. Grubo.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)