Co biorą programiści Haskella podczas wymyślania nazw operatorów?

7

Wczoraj próbowałem ukraść cudzy kod zainspirować się cudzym projektem i nagle wyskakuje mi konflikt nazw na operatorze >$$<. Tak, ktoś w mało znanym i przydatnym projekcie zrobił sobie operator >$$<. I ten operator popadł w konflikt z operatorem z biblioteki relude, której używam jako biblioteki standardowej. Pewnie się zastanawiacie co robi operator >$$< w bibliotece standardowej. Oczywiście wygooglanie frazy Haskell >$$< nie zwraca nic konkretnego. Na szczęście jest Hoogle i możemy się dowiedzieć że operator >$$< robi to samo fo funkcja contramap co ma nawet sens bo operator <$> robi to samo co funkcja fmap (zwana map w Scali czy Select w C#).

Co robi operator >$$< w projekcie który staram się zrozumieć nie mam pojęcia :D
Dlatego zastanawiam się co biorą programiści Haskella gdy wymyślają te operatory :P

PS problem też dotyczył legendarnej biblioteki Scalaz w Scali. Też była zawalona dziwnymi operatorami, ale w owiele mniejszym stopniu

3

>$$< czy <$> - wygląda na utajoną nostalgię za Perlem ;-)

3
yarel napisał(a):

>$$< czy <$> - wygląda na utajoną nostalgię za Perlem ;-)

A co powiesz na stare dobre $? Jest jeszcze $> i <$ oraz >$<, >$ i $<

1

Kiedyś na ćwiczeniach z analizy matematycznej wykładowca opowiadał o jakiejś pionierskiej pracy, w której autor(rzy?) postulowali wprowadzenie nowej notacji, która miała być prosta (mało symboli), zwięzła, elegancka, wyrażać symetrię i inne cuda. Były pochylenia w lewo, w prawo. No ale pojawił się problem - jak zapisać kropkę kursywą, by była odróżnialna od innej kropki?
Pewnie nie znali Haskella, bo wystarczyło dodać $ przed kropką.

Pozostaje się cieszyć, że programiści (jeszcze?) nie wymyślili, że można by zmieniać znaczenie operatora, przez zapisanie kursywą, wytłuszczeniem, czy podkreśleniem. Jakby nie patrzeć, to można swobodnie komponować takie elementy. Niewyobrażalne możliwości ;-)

3
yarel napisał(a):

No ale pojawił się problem - jak zapisać kropkę kursywą, by była odróżnialna od innej kropki?
Pewnie nie znali Haskella, bo wystarczyło dodać $ przed kropką.

można nie używać kropki

TADAM!

1

@KamilAdam: myślałem że Ty jesteś zawsze poważny, a tu zonk, używasz emojii w programowaniu xD
Operator >$$< wygląda bardzo podobnie do ~(^-^)~ i teraz to się zastanawiam czy w ogóle brać się za Haskella.
Wprawdzie moje plany w stosunku do tego języka były dość długoterminowe, ale nie skreśliłem go.. do dziś.
Z Perla zrezygnowałem gdy zobaczyłem pierwsze jednolinijkowce w tym języku:
perl -le 'map { print "Prime $_" if (1 x $_) !~ /^1?$|^(11+?)\1+$/ } 1..10001'

W programowaniu unikam ludzi którzy lubią coś zrobić "po swojemu". Śmieszne operatorki, klasa która jest encją ale nazywa się xxxUtils, jednolinijkowe obliczanie całego algorytmu.

Dlatego długo pracowałem z Pascalem (6 lat) i COBOLem (8 lat) bo tam ciężko zrobić takie potworki. A w pracy różni ludzie są.
Niestety spotkałem raz majstra który nawet w COBOLu potrafił wyczarować coś takiego:
IF NOT WS-OPTIONAL-BALANCE-NOT-REQUIRED-YES THEN ...

Co innego w domu prywatne programy np. do kontroli liczby lądujących UFO w ciągu doby. Tu pewnie Haskell, Perl czy Brainfuck jest spoko.

BTW, zastanawiam się skąd się wzięła ta strona: Haskell VS Discord Emoji - przypadek?

2
yarel napisał(a):

Kiedyś na ćwiczeniach z analizy matematycznej wykładowca opowiadał o jakiejś pionierskiej pracy, w której autor(rzy?) postulowali wprowadzenie nowej notacji, która miała być prosta (mało symboli), zwięzła, elegancka, wyrażać symetrię i inne cuda. Były pochylenia w lewo, w prawo. No ale pojawił się problem - jak zapisać kropkę kursywą, by była odróżnialna od innej kropki?
Pewnie nie znali Haskella, bo wystarczyło dodać $ przed kropką.

Bardziej > i < przed lub za operatorem. BTW jak już mówimy o kropkach to standardowo w Haskellu kropka . jest operatorem kompozycji funkcji (odpowiednik compose ze Scali). Ale ktoś zwrócił uwagę że . komponuje tylko w jedną stronę (nie ma odpowiednika andThen ze Scali) i napisał swoją bibliotekę z operatorami <. i .> XD

8
vpiotr napisał(a):

@KamilAdam: myślałem że Ty jesteś zawsze poważny, a tu zonk, używasz emojii w programowaniu xD

Teraz to mnie zainspirowałeś. Czy w Haskellu da się zrobić operator 💩 . Odpowiedź da się:

main = putStrLn $ "hello" 💩 "world"

(💩) :: String -> String -> String
(💩) s1 s2 = s1 ++ " shitty " ++ s2

Wynik:

hello shitty world

Z Perla zrezygnowałem gdy zobaczyłem pierwsze jednolinijkowce w tym języku:
perl -le 'map { print "Prime $_" if (1 x $_) !~ /^1?$|^(11+?)\1+$/ } 1..10001'

Jak pisałem hobbystycznie w Perlu to miałem wrażenie że kod się na mnie patrzy. Cały czas miałem jednookiego $_[0]. Z czasem nauczyłem się jak się tego pozbyć, ale jakoś zrezygnowałem z tego jezyka :D

5

Ten konflikt przypomina mi troche mojego wykladowce po 60tce, ktory nakradl sie (nie wiemy skad) jakichs programikow w C#, ktore mialy zmienne ponazywane:

x_
xx__
xxx___
xxxx____
xxxxx_____
xxxxxx_______

Chlop cos zmienial demonstrujac nam swoj kunsz po czym popadl w konflikt nazw, a ostatecznie zmieniajac ilosc iteracji w petli spalil sobie swojego przenosnego robota ;-)

1

perl -le 'map { print "Prime $_" if (1 x $_) !~ /^1?$|^(11+?)\1+$/ } 1..10001'

Aż prosi się użyć w tym jakiegoś wyrażenia regularnego.

0

Tak sobie czytam te tematy o Haskellu i chyba jednak bym wolał programować w PIEJCZPI :D

4

>$$< - tutaj zarabiasz kase podczas stosowania
<$> - tutaj wydajesz kase i tracisz

6

Operatory:

  • dla niewprawionych w danej dziedzinie ograniczają czytelność (poprzez odstraszanie)
  • dla wprawionych znacznie poprawiają (bo dużo mniej do czytania)

Coś za coś.

Zwyczaj pewnie pochodzi od matematyków - też wprowadza się różne symbole, zamiast nazw funkcji.

Ja tam nie widzę problemu - wiadomo, że czasem ktoś przesadzi :-), ale ogólnie w zespole zwykle się dogadujemy, które operatory używamy (bo są częste i oczywiste),
a które olewamy (i używamy nazw funkcji, bo zwyczaj jest taki, że zwykle się daje taką alternatywę).
W sumie wolę dziwne operatory haskellowe niż przeciążanie operatorów z ograniczonego zestawu (jak w C++ czy Kotlinie). Pomyśl jaki byłby mindfuck jakby zamiast tego >$$< było *, które nie oznacza mnożenia.

0

nie wiem co biorą ale tez chce

0

W sumie wolę dziwne operatory haskellowe niż przeciążanie operatorów z ograniczonego zestawu (jak w C++ czy Kotlinie). Pomyśl jaki byłby mindfuck jakby zamiast tego >$$< było *, które nie oznacza mnożenia.

Ograniczona ilość operatorów do przeciążenia raczej miała w założeniu zapobiegać mindfuckowi. Takie mnożenie, które nie jest mnożeniem to widuję głównie w jakiś konkursach na obfuskację a nie w produkcyjnym kodzie.

Operatory to dziwny twór. Nawet ograniczony zestaw używany zgodnie z intuicją może stać się problemem, patrz taki spaceship operator w C++.

1 użytkowników online, w tym zalogowanych: 0, gości: 1