Jaký programovací jazyk zvolit?

Radek Miček

Re:Jaký programovací jazyk zvolit?
« Odpověď #285 kdy: 30. 08. 2016, 14:54:32 »
Chápu. Potíž je v tom, že obě konstrukce se trochu liší (jsou popsány i v různých částech specifikace - jedna v 6.23, druhá v 8.5).
No a jsme u toho... Vyjimky, speciality, vyjimky z vyjimek a specialni vyjimky ze specialit... :)

Jj, třeba Haskell a Elm mají AFAIK pouze jeden typ funkcí, Scala jich má několik (např. funkce, parciální funkce, ...).

Ten import přidá novou funkci mapWith, která nemá různé overloady (původní map má minimálně 2), tj. kompilátor snáze uhodne typ.
Aha. Takze hnusny hack na neco, co bych ocekaval, ze bude fungovat samo od sebe...

Je to blbě navržené API. Obecně jazyky s dobrou typovou inferencí mají dobrý důvod, proč nemít overloading (vede to na explozi možností, které kompilátor musí uvažovat - jeden z důvodů, proč Scala nemá dobrou typovou inferenci).


Re:Jaký programovací jazyk zvolit?
« Odpověď #286 kdy: 30. 08. 2016, 14:59:28 »
Je to blbě navržené API.
Nemyslím, že blbě. Je to tak nejspíš proto, aby bylo API společné pro Javu i Scalu - a scalovské speciality byly jenom jako plus bokem.

Obecně jazyky s dobrou typovou inferencí mají dobrý důvod, proč nemít overloading (vede to na explozi možností, které kompilátor musí uvažovat - jeden z důvodů, proč Scala nemá dobrou typovou inferenci).
Jo. A je to další konkrétní příklad  komplikace, kterou má Scala  kvůli interoperabilitě s Javou.

Radek Miček

Re:Jaký programovací jazyk zvolit?
« Odpověď #287 kdy: 30. 08. 2016, 15:12:00 »
Je to blbě navržené API.
Nemyslím, že blbě. Je to tak nejspíš proto, aby bylo API společné pro Javu i Scalu - a scalovské speciality byly jenom jako plus bokem.

Já myslím, že ano, protože ve Sparku to funguje dobře (v Javě 8 i Scale) - tam overloading nepoužili.

Citace
Jo. A je to další konkrétní příklad  komplikace, kterou má Scala  kvůli interoperabilitě s Javou.

Jj, tohle je dobrý příklad - overloading dost komplikuje jazyk.

Re:Jaký programovací jazyk zvolit?
« Odpověď #288 kdy: 30. 08. 2016, 16:20:46 »
Já myslím, že ano, protože ve Sparku to funguje dobře (v Javě 8 i Scale) - tam overloading nepoužili.
A k jakemu presne problemu tam dochazi? Snazim se to z API nejak vydedukovat, ale pusto, prazdno, temno... :)

Flinkovske API je
Kód: [Vybrat]
public <R> DataStream<R> map(scala.Function1<T,R> fun,
                             TypeInformation<R> evidence$6)
public <R> DataStream<R> map(MapFunction<T,R> mapper,
                             TypeInformation<R> evidence$7)
https://ci.apache.org/projects/flink/flink-docs-release-1.1/api/java/org/apache/flink/streaming/api/scala/DataStream.html#map-scala.Function1-org.apache.flink.api.common.typeinfo.TypeInformation-

...a to Sparkovske mi prijde uplne stejne:
Kód: [Vybrat]
def map[U](func: MapFunction[T, U], encoder: Encoder[U]): Dataset[U]
def map[U](func: (T) ⇒ U)(implicit arg0: Encoder[U]): Dataset[U]
http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset

.

Re:Jaký programovací jazyk zvolit?
« Odpověď #289 kdy: 30. 08. 2016, 16:32:30 »
Ta diskuse o kvalitě na příkladu Blesku mne zaujala.

Jen mne překvapilo, že nikdo nezmínil Windows. Z tohoto pohledu jsou Windows extrémně kvalitní produkt, poněvadž jejich podílu na trhu se třeba Blesk ani zdálky nepřiblížil. Tak potom nevím, na co si tady v diskusích všichni stěžují, jak Win stojí za prd...


Re:Jaký programovací jazyk zvolit?
« Odpověď #290 kdy: 30. 08. 2016, 16:55:53 »
Ta diskuse o kvalitě na příkladu Blesku mne zaujala.

Jen mne překvapilo, že nikdo nezmínil Windows. Z tohoto pohledu jsou Windows extrémně kvalitní produkt, poněvadž jejich podílu na trhu se třeba Blesk ani zdálky nepřiblížil. Tak potom nevím, na co si tady v diskusích všichni stěžují, jak Win stojí za prd...

+1

Radek Miček

Re:Jaký programovací jazyk zvolit?
« Odpověď #291 kdy: 30. 08. 2016, 17:37:51 »
Já myslím, že ano, protože ve Sparku to funguje dobře (v Javě 8 i Scale) - tam overloading nepoužili.
A k jakemu presne problemu tam dochazi? Snazim se to z API nejak vydedukovat, ale pusto, prazdno, temno... :)

Flinkovske API je
Kód: [Vybrat]
public <R> DataStream<R> map(scala.Function1<T,R> fun,
                             TypeInformation<R> evidence$6)
public <R> DataStream<R> map(MapFunction<T,R> mapper,
                             TypeInformation<R> evidence$7)
https://ci.apache.org/projects/flink/flink-docs-release-1.1/api/java/org/apache/flink/streaming/api/scala/DataStream.html#map-scala.Function1-org.apache.flink.api.common.typeinfo.TypeInformation-

...a to Sparkovske mi prijde uplne stejne:
Kód: [Vybrat]
def map[U](func: MapFunction[T, U], encoder: Encoder[U]): Dataset[U]
def map[U](func: (T) ⇒ U)(implicit arg0: Encoder[U]): Dataset[U]
http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset

U Sparku jsem myslel na RDD třídy (kde je skutečně jen jedna metoda map). Tady u Datasetu se obě metody liší počtem parametrů (první má 2, druhá má 1) - když předáte pouze funkci, kompilátor Scaly snadno pozná, že chcete volat tu druhou metodu s jedním parametrem (když ví, jakou metodu chcete volat, použije typ parametru metody, k určení typu anonymní funkce).

Zatímco u Flinku ve Scale je situace jiná (vy se koukáte na Flink v Javě):

Kód: [Vybrat]
def map[R](fun: (T) ⇒ R)(implicit arg0: TypeInformation[R], arg1: ClassTag[R]): DataSet[R]
def map[R](mapper: MapFunction[T, R])(implicit arg0: TypeInformation[R], arg1: ClassTag[R]): DataSet[R]

Obě metody ve Flinku mají jeden parametr - na rozdíl od Sparku kompilátor k jejich odlišení musí použít typ prvního argumentu (jenže ten zatím nezná).

Rozdíl je tedy v tom, že Flink má dvě metody map s jedním parametrem a Spark jen jednu.

Re:Jaký programovací jazyk zvolit?
« Odpověď #292 kdy: 30. 08. 2016, 17:57:22 »
Tady u Datasetu se obě metody liší počtem parametrů (první má 2, druhá má 1)
No ale ta s jednim ma zas druhy implicitni - takze kompilator musi taky resit, jestli jsem ho nepredal, ne?

(Anebo ten zapis zas nechapu, to je klidne mozny :) )

vy se koukáte na Flink v Javě):

Kód: [Vybrat]
def map[R](fun: (T) ⇒ R)(implicit arg0: TypeInformation[R], arg1: ClassTag[R]): DataSet[R]
def map[R](mapper: MapFunction[T, R])(implicit arg0: TypeInformation[R], arg1: ClassTag[R]): DataSet[R]
Odkud je tohle? Ve scalovskem api DataStream vubec nevidim: https://ci.apache.org/projects/flink/flink-docs-release-1.1/api/scala/index.html

Radek Miček

Re:Jaký programovací jazyk zvolit?
« Odpověď #293 kdy: 30. 08. 2016, 18:15:07 »
Tady u Datasetu se obě metody liší počtem parametrů (první má 2, druhá má 1)
No ale ta s jednim ma zas druhy implicitni - takze kompilator musi taky resit, jestli jsem ho nepredal, ne?

Ta první metoda

Kód: [Vybrat]
def map[U](func: MapFunction[T, U], encoder: Encoder[U]): Dataset[U]
jde zavolat pouze map(f, e).

Zatímco druhou metodu

Kód: [Vybrat]
def map[U](func: (T) ⇒ U)(implicit arg0: Encoder[U]): Dataset[U]
jde volat map(f)(e) nebo map(f) nebo map { f } (e) nebo map { f } atd. Společené je to, že první seznam argumentů obsahuje vždy jeden argument (u první metody první seznam argumentů obsahuje vždy dva argumenty).

Tj. když napíšete

Kód: [Vybrat]
.map { case (x, y) => ??? }
tak je kompilátoru jasné, že voláte tu druhou metodu, neboť první seznam argumentů obsahuje jeden argument.

Citace
Odkud je tohle? Ve scalovskem api DataStream vubec nevidim: https://ci.apache.org/projects/flink/flink-docs-release-1.1/api/scala/index.html

To jsem omylem okopíroval z DataSetu - DataStream tam také nevidím.

Re:Jaký programovací jazyk zvolit?
« Odpověď #294 kdy: 31. 08. 2016, 00:35:36 »
tak je kompilátoru jasné, že voláte tu druhou metodu, neboť první seznam argumentů obsahuje jeden argument.
Aha, už je mi to jasné (snad ;) ). Tyhlety vícenásobné seznamy parametrů, to je taky lahůdka, se kterou jsem se ještě nestihl pořádně seznámit :) Děkuju za výsvětlení!

...no každopádně myslím, že sice silný offtopic, ale jako ilustrace, proč mi přijde Scala zbytečně překombinovaná oproti "normálním" funkcionálním jazykům, to posloužilo dobře :)