Je Rust jazyk budoucnosti?

Re:Je Rust jazyk budoucnosti?
« Odpověď #390 kdy: 07. 12. 2022, 12:31:16 »
Citace od: BoneFlute kdy 07. 12. 2022, 12:24:56
Citace od: oss kdy 07. 12. 2022, 12:14:00
Je ekvivalentne.
Není.
Technicky vzato to ekvivalentní samozřejmě není (specificky tahle řádka uričtě ne), ale smysl kódu je v zásadě stejný. Na začátku se buď vytvoří hodnota daného typu, nebo se vyhodí chyba...

Liší se technické detaily, v Javě například to bude muset mít objekt, nebudeš moct použít infixové operátory a řada dalších technických rozdílů...


BoneFlute

  • *****
  • 2 155
Re:Je Rust jazyk budoucnosti?
« Odpověď #391 kdy: 07. 12. 2022, 13:11:01 »
Citace od: Králík kdy 07. 12. 2022, 12:31:16
Citace od: BoneFlute kdy 07. 12. 2022, 12:24:56
Citace od: oss kdy 07. 12. 2022, 12:14:00
Je ekvivalentne.
Není.
Technicky vzato to ekvivalentní samozřejmě není (specificky tahle řádka uričtě ne), ale smysl kódu je v zásadě stejný. Na začátku se buď vytvoří hodnota daného typu, nebo se vyhodí chyba...

Liší se technické detaily, v Javě například to bude muset mít objekt, nebudeš moct použít infixové operátory a řada dalších technických rozdílů...

Na technické detaily ti zvrací alík.

Liší se hlavně záruky.
V C# můžu tu validaci zapomenout. Skončí mi to výjimkou u assert v run-time. Zatímco v Idrisu mi to přinutí tu kontrolu udělat compile-time. To je ta zásadní motivace, proč se všechny ty šaškárny s typama dělají.

Idris mě přinutí tu kontrolu udělat.
C#, Java, Python mi tu kontrolu udělat nepřinutí. Data corupted sice nenastane (jsi-li alespoň trochu šikovnej), ale spadne to až za běhu.

Do třetice:
V Idrisu (a Haskellu) - nalinkuju si nějakou knihovnu, použiju a pokusím se přeložit, a ono to začne řvát tady a tady a tady a tady... opravím, přeložím, běží.

V C# - nalinkuju si nějakou knihovnu, použiju, a úspěšně přeložím, spustím, a ono to začne padat tehdy, a tehdy, a tehdy, a tehdy... nejlépe u zákazníka.

BoneFlute

  • *****
  • 2 155
Re:Je Rust jazyk budoucnosti?
« Odpověď #392 kdy: 07. 12. 2022, 13:16:24 »
Citace od: oss kdy 07. 12. 2022, 12:14:00
Viem, kam smerujes, ale ked sa bavime o vstupoch od pouzivatela, tak:

new Even(input);

Je ekvivalentne.


let Yes _ = decIsEven n | _ => putStrLn "n isn't even"

Není.
Nebo ty tam vidíš někde, že bych tu výjimku, kterou Even vyhazuje odchytával?

Idris

  • *****
  • 2 286
Re:Je Rust jazyk budoucnosti?
« Odpověď #393 kdy: 07. 12. 2022, 13:29:25 »
Citace od: BoneFlute kdy 07. 12. 2022, 13:11:01
Citace od: Králík kdy 07. 12. 2022, 12:31:16
Citace od: BoneFlute kdy 07. 12. 2022, 12:24:56
Citace od: oss kdy 07. 12. 2022, 12:14:00
Je ekvivalentne.
Není.
Technicky vzato to ekvivalentní samozřejmě není (specificky tahle řádka uričtě ne), ale smysl kódu je v zásadě stejný. Na začátku se buď vytvoří hodnota daného typu, nebo se vyhodí chyba...

Liší se technické detaily, v Javě například to bude muset mít objekt, nebudeš moct použít infixové operátory a řada dalších technických rozdílů...

Na technické detaily ti zvrací alík.

Liší se hlavně záruky.
V C# můžu tu validaci zapomenout. Skončí mi to výjimkou u assert v run-time. Zatímco v Idrisu mi to přinutí tu kontrolu udělat compile-time. To je ta zásadní motivace, proč se všechny ty šaškárny s typama dělají.

Idris mě přinutí tu kontrolu udělat.
C#, Java, Python mi tu kontrolu udělat nepřinutí. Data corupted sice nenastane (jsi-li alespoň trochu šikovnej), ale spadne to až za běhu.

Do třetice:
V Idrisu (a Haskellu) - nalinkuju si nějakou knihovnu, použiju a pokusím se přeložit, a ono to začne řvát tady a tady a tady a tady... opravím, přeložím, běží.

V C# - nalinkuju si nějakou knihovnu, použiju, a úspěšně přeložím, spustím, a ono to začne padat tehdy, a tehdy, a tehdy, a tehdy... nejlépe u zákazníka.
Akorát cena za to je, že ty šikovné typy pro ověření musí někdo napsat. Pro základní věci (čísla, seznamy) je má standardní knihovna, nicméně pro méně typické věci (třeba i ta jednoduchá sudost) to musí napsat laskavý čtenář vývojář.

Idris

  • *****
  • 2 286
Re:Je Rust jazyk budoucnosti?
« Odpověď #394 kdy: 07. 12. 2022, 13:31:03 »
Citace od: BoneFlute kdy 07. 12. 2022, 03:59:35
Citace od: Idris kdy 07. 12. 2022, 01:58:43
Kdybych tam cpal čísla ze vstupu, musel bych si to ověření sudosti (prfX) vyrobit sám a předat ho explicitně.
Mohl by si mi ukázat, jak by to vypadalo?
BTW až se budeš cítit na definici decIsEven, dej vědět  ;)


BoneFlute

  • *****
  • 2 155
Re:Je Rust jazyk budoucnosti?
« Odpověď #395 kdy: 07. 12. 2022, 13:37:10 »
Citace od: Idris kdy 07. 12. 2022, 13:29:25
Akorát cena za to je, že ty šikovné typy pro ověření musí někdo napsat.
Já tu třídu v C# taky musel napsat.

Re:Je Rust jazyk budoucnosti?
« Odpověď #396 kdy: 07. 12. 2022, 13:38:34 »
Citace od: BoneFlute kdy 07. 12. 2022, 11:55:25
A abych byl hodně cynický, tak ona možná není nijak zvláštní poptávka ani po bezpečném kódu (Clojure...

triggered

Re:Je Rust jazyk budoucnosti?
« Odpověď #397 kdy: 07. 12. 2022, 13:42:37 »
Citace od: BoneFlute kdy 07. 12. 2022, 13:11:01
C#, Java, Python mi tu kontrolu udělat nepřinutí. Data corupted sice nenastane (jsi-li alespoň trochu šikovnej), ale spadne to až za běhu.
Bavíme se o vstupu od uživatele, tzn. tam z principu to musí vyhodit chybu za běhu při načítání dat. Pokud při načítání dat chyba nenastane a úspěšně je vytvořena příslušná hodnota příslušného typu v C# nebo Javě (o Py to neplatí), tak pak přece není už důvod, aby to padalo někde dále, ne?

BoneFlute

  • *****
  • 2 155
Re:Je Rust jazyk budoucnosti?
« Odpověď #398 kdy: 07. 12. 2022, 14:25:04 »
Citace od: Králík kdy 07. 12. 2022, 13:42:37
Citace od: BoneFlute kdy 07. 12. 2022, 13:11:01
C#, Java, Python mi tu kontrolu udělat nepřinutí. Data corupted sice nenastane (jsi-li alespoň trochu šikovnej), ale spadne to až za běhu.
Bavíme se o vstupu od uživatele, tzn. tam z principu to musí vyhodit chybu za běhu při načítání dat. Pokud při načítání dat chyba nenastane a úspěšně je vytvořena příslušná hodnota příslušného typu v C# nebo Javě (o Py to neplatí), tak pak přece není už důvod, aby to padalo někde dále, ne?
O to nejde.

Samozřejmě, že ten scénář musím zohlednit v runtime.

Problém je v tom, že v Idrisu se mi nestane to, co se mi stane v C# v tom příkladu, který jsem uváděl. Že tu chybu neodchytím, tedy nezpracuji, tedy jsem tu chybu nezohlednil.

Částečně by toto řešil systém Checked Exception, od kterých se ale bohužel upouští. Úplně netuším proč. (C# je třeba schválně nemá.)

Re:Je Rust jazyk budoucnosti?
« Odpověď #399 kdy: 07. 12. 2022, 14:26:17 »
Citace od: Králík kdy 07. 12. 2022, 11:12:21
Případně ještě se zeptám obecně: Jaké jsou v Haskellu a Idrisu pravidla ohledně koherence? Dejme tomu, že ve svém programu používám knihovny libA a libB, knihovna libA definuje typeclass Tc a libB typ Foo. Můžu instanciovat Tc pro Foo?

Na toto jsem nedostal odpověď, tak jsem se zeptal na SO. TL;DR Haskell dovoluje orphan type instances vč. odvozených z dependencí. (Je Idris v tomto jiný? Asi bych to nečekal.)

@BoneFlute toto je příklad, kdy Rust musí omezovat typové abstrakce kvůli engineering constraints - nemůže dovolit orphan trait implementace na úrovni knihoven (na úrovni modulů ano), protože by to jednak způsobovalo semver hazardy a také pravděpodobně problémy s linkováním (zejména dynamickým), nejspíš by implementace traitů už nemohly být anonymní...

Zajímavé je, že Haskellu tohle nevadí, efektivně přidání jakékoli zvenku viditelné instance v knihovně je semver-incompatible změna...

Idris

  • *****
  • 2 286
Re:Je Rust jazyk budoucnosti?
« Odpověď #400 kdy: 07. 12. 2022, 14:27:48 »
Citace od: BoneFlute kdy 07. 12. 2022, 14:25:04
Citace od: Králík kdy 07. 12. 2022, 13:42:37
Citace od: BoneFlute kdy 07. 12. 2022, 13:11:01
C#, Java, Python mi tu kontrolu udělat nepřinutí. Data corupted sice nenastane (jsi-li alespoň trochu šikovnej), ale spadne to až za běhu.
Bavíme se o vstupu od uživatele, tzn. tam z principu to musí vyhodit chybu za běhu při načítání dat. Pokud při načítání dat chyba nenastane a úspěšně je vytvořena příslušná hodnota příslušného typu v C# nebo Javě (o Py to neplatí), tak pak přece není už důvod, aby to padalo někde dále, ne?
O to nejde.

Samozřejmě, že ten scénář musím zohlednit v runtime.

Problém je v tom, že v Idrisu se mi nestane to, co se mi stane v C# v tom příkladu, který jsem uváděl. Že tu chybu neodchytím, tedy nezpracuji, tedy jsem tu chybu nezohlednil.

Částečně by toto řešil systém Checked Exception, od kterých se ale bohužel upouští. Úplně netuším proč. (C# je třeba schválně nemá.)
BTW v Idrisu jde garantovat i vlastnosti návratových hodnot, nejen vstupních parametrů.

Re:Je Rust jazyk budoucnosti?
« Odpověď #401 kdy: 07. 12. 2022, 14:28:41 »
Citace od: BoneFlute kdy 07. 12. 2022, 14:25:04
Problém je v tom, že v Idrisu se mi nestane to, co se mi stane v C# v tom příkladu, který jsem uváděl. Že tu chybu neodchytím, tedy nezpracuji, tedy jsem tu chybu nezohlednil.
To je jedno ne? Hodnota toho typu nebude vytvořena, pokud konstruktor vyhodil výjimku...

BoneFlute

  • *****
  • 2 155
Re:Je Rust jazyk budoucnosti?
« Odpověď #402 kdy: 07. 12. 2022, 14:29:12 »
Citace od: Idris kdy 07. 12. 2022, 13:29:25
Akorát cena za to je,
Imho statické typy mají jiné problémy.
Namátkou:
- jsou náročné na čas výpočtu
- jsou náročné na vývoj jazyka
- jsou náročné na skill uživatele
- lidé nechápou co to je statické typování

Idris

  • *****
  • 2 286
Re:Je Rust jazyk budoucnosti?
« Odpověď #403 kdy: 07. 12. 2022, 14:30:38 »
Citace od: Králík kdy 07. 12. 2022, 14:26:17
Citace od: Králík kdy 07. 12. 2022, 11:12:21
Případně ještě se zeptám obecně: Jaké jsou v Haskellu a Idrisu pravidla ohledně koherence? Dejme tomu, že ve svém programu používám knihovny libA a libB, knihovna libA definuje typeclass Tc a libB typ Foo. Můžu instanciovat Tc pro Foo?

Na toto jsem nedostal odpověď, tak jsem se zeptal na SO. TL;DR Haskell dovoluje orphan type instances vč. odvozených z dependencí. (Je Idris v tomto jiný? Asi bych to nečekal.)
Idris to má stejně.

BoneFlute

  • *****
  • 2 155
Re:Je Rust jazyk budoucnosti?
« Odpověď #404 kdy: 07. 12. 2022, 14:30:48 »
Citace od: Králík kdy 07. 12. 2022, 14:28:41
Citace od: BoneFlute kdy 07. 12. 2022, 14:25:04
Problém je v tom, že v Idrisu se mi nestane to, co se mi stane v C# v tom příkladu, který jsem uváděl. Že tu chybu neodchytím, tedy nezpracuji, tedy jsem tu chybu nezohlednil.
To je jedno ne? Hodnota toho typu nebude vytvořena, pokud konstruktor vyhodil výjimku...
Zákazník: Tak jsem zkoušel vaši aplikaci a je úplně k ničemu. Jsem tam normálně zadal číslo, a ono to spadlo.
Já: To je jedno ne?