Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Idris

Stran: 1 ... 9 10 [11] 12 13 ... 153
151
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 15:13:53 »
V Idrisu jsem taky našel funkci á la panic (builtins.idris_crash).
Jenže to normálně použít nejde, jen ve funkci, která je explicitně partial, což se prakticky nepoužívá (a v produkci nikdy). Takže tohle se taky vůbec nepřeloží.

152
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 15:05:32 »
Je to stejně jako v Haskellu, panikovat v konstruktoru můžeš, ale slušné je vrátit `Result` což je to samé co `Either`...
Lepší by bylo si tu slušnost od autora kódu vynutit: Kašleš na chyby? Tak to mi můžeš, syntax error :)
Věřim ti, že obecně Idris více tlačí uživatele do ošetření chyb, ale ten rozdíl je kvantitativní...
Tak jistě, když se ti počítač vznítí a ty na něj chrstneš kýbl vody, tak to asi Idris nezachrání. Ale donutí tě náležitě ošetřit všechny logické chyby v kódu (typu dělení nulou, že se nevolá head na prázdný seznam apod.).

153
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 14:42:09 »
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...
V Rustu to bude panic?
Je to stejně jako v Haskellu, panikovat v konstruktoru můžeš, ale slušné je vrátit `Result` což je to samé co `Either`...
Lepší by bylo si tu slušnost od autora kódu vynutit: Kašleš na chyby? Tak to mi můžeš, syntax error :)

154
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 14:40:38 »
Jsou náročné na čas výpočtu v době překladu, za běhu ne.
Ano, ano, sorry.
A platí o opak, že za běhu by to mělo být rychlejší.
Taky že je, například v Julii (ta je extrabuřt, je dynamicky typovaná, ale pozná stabilně otypovaný kód a odvodí si všechny typy).

155
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 14:38:42 »
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?
To je ale něco jiného, to spadlo, protože nebyla dobře ošetřena chyba
Teď jsi na to kápnul, ten program v Idrisu se nepřeloží, pokud nejsou správně ošetřeny všechny chyby.

156
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 14:36:22 »
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...
V Rustu to bude panic?

157
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 14:35:43 »
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?
Slušný vývojář tu výjimku odchytí a vypíše třeba “Sorry vole error”.

158
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 14:34:01 »
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í
Doplnění: Jsou náročné na čas výpočtu v době překladu, za běhu ne. Nicméně SPARK se svou formální verifikací je na tom hůře, kdysi na nějaké přednášce někdo z NASA vykládal, jak se jim kód překládá týden. Ale pak věděli, že je absolutně bezpečný :)

Ten zbytek platí, jde to shrnout do jednoho bodu o Inkových “mentálních obzorech”.

159
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 14:30:38 »
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ě.

160
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 14:27:48 »
C#, Java, Python mi tu kontrolu udělat nepřinutí. Data corupted sice nenastane (jsi-li alespoň trochu šikovnej), ale spadne to 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ů.

161
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 13:31:03 »
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  ;)

162
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 13:29:25 »
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 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ář.

163
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 11:19:36 »
Kód: [Vybrat]
total main : IO ()
main = do
    Just n <- readNat | _ => putStrLn "not a natural number"
    let Yes _ = decIsEven n | _ => putStrLn "n isn't even"
    Just m <- readNat | _ => putStrLn "not a natural number"
    let Yes _ = decIsEven m | _ => putStrLn "m isn't even"
    putStrLn $ "Hello: " ++ (show (sumx n m))
Tady by mě zajímalo, jaká jsou pravidla pro scoping té anonymní instance IsEven. Jak daleko může být od místa volání sumx, aby to kompilátor ještě našel / dosadil implicitní arg? Pokud by to bylo v externím kódu, muselo by se to třeba nějak importovat?
To nevím, specifikované to není a závisí to na verzi překladače (novější jsou chytřejší). Když to překladač nenajde, musí se předat explictně {prf1 = isevenN}.

164
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 08:37:12 »
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?
Jasně, včera jsem to už zkoušel, abych viděl, jak se současná verze chová.
Kód: [Vybrat]
total main : IO ()
main = do
    Just n <- readNat | _ => putStrLn "not a natural number"
    let Yes _ = decIsEven n | _ => putStrLn "n isn't even"
    Just m <- readNat | _ => putStrLn "not a natural number"
    let Yes _ = decIsEven m | _ => putStrLn "m isn't even"
    putStrLn $ "Hello: " ++ (show (sumx n m))
Když tam nebude to let Yes ..., tak kód neprojde typovou kontrolou.

P.S. Psal jsem "předat explicitně", ale ve verzi 0.6.0 to už zřejmě není nutné, překladač si to ověření najde v ASTu.

165
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 01:58:43 »
Tak mám spousta více či méně blbejch otázek:

1/ proč tam musím uvádět {auto 0 prf1 : IsEven n} ?
2/ proč je to mezi šipkama? Ta funkce má jen tři parametry, ne pět.
3/ co to vlastně to {auto 0 prf1 : IsEven n} říká?
4/ proč tam ten prf1 musí být, když tam nikde nefiguruje? Proč musí být různý? prf1 a prf2
1. To jsou prerekvizity, které chceš (sudost argumentů). To "auto" znamená, že si to má překladač ověřit sám.
2. To je jen konvence, implicitní parametry můžou být kdekoliv. Ta funkce má dva parametry a dvě prerekvizity.
3. IsEven n říká, že n je zaručeně sudé. A prf1/prf2 je prostě jméno té prerekvizity.
4. Jsou různé, protože máš dva vstupní parametry, které chceš mít sudé. Být tam musí, aby sis vynutil tu sudost (kdyby se to nepředávalo, na vstupu by mohlo být libovolné číslo).

Kdybych tam cpal čísla ze vstupu, musel bych si to ověření sudosti (prfX) vyrobit sám a předat ho explicitně.

Stran: 1 ... 9 10 [11] 12 13 ... 153