31
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 13:37:10 »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.
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.
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.
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...Je ekvivalentne.Není.
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ů...
Ale jistě. Jak jsem psal tady: https://forum.root.cz/index.php?topic=23802.msg380764#msg380764Mna by tiez zaujimalo, ako si tieto super uzasne jazyky, ktore maju typ na parne cislo alebo neprazdny string (co sa da aj v tej heitovanej jave, ci C#) poradia so vstupmy od pouzivatela, ci ineho systemu, kde moze prist akakolvek blbost.Úplně stejně... tu příchozí hodnotu naparsuješ/dekóduješ a výsledkem takový operace je buď ten správný typ, nebo chyba...
Vdaka za odpoved.
No v tom pripade mi tieto hadky nad typovym systemom pridu dost zbytocne.
"Třeba takhle?Musíš. Protože tvrdím, že to nejde. Možná nechápeš zadání, a myslíš si, že když mi to vyhodí výjimku, že číslo není sudé, tak, že je splněno.Tak se předveď, ne?
Pomocou value objektu (co realne aspon v C# nemusi byt objekt). To hadam takym amchrom na typy vysvetlovat nemusim.
Vid kralikovu odpoved.
Trik je v tom, ze instancia daneho value objektu nemoze vzniknut pokial sa nejedna o pare cislo.
[TestMethod]
public void Trik()
{
var input = 3;
var a = new Even(input);
var res = Sum(a, new Even(2));
}
private Even Sum(Even a, Even b)
{
}
class Even
{
private readonly int val;
public Even(int val)
{
assertEven(val);
this.val = val;
}
}
Musíš. Protože tvrdím, že to nejde. Možná nechápeš zadání, a myslíš si, že když mi to vyhodí výjimku, že číslo není sudé, tak, že je splněno.Tak se předveď, ne?
Pomocou value objektu (co realne aspon v C# nemusi byt objekt). To hadam takym amchrom na typy vysvetlovat nemusim.
https://forum.root.cz/index.php?topic=23802.msg380723#msg380723Na tuto otázku tu již byla odpověď.
Mozes sem dat odkaz, lebo dost sa stracam v tejto diskusii, kedze sa tu hadate o milion veciach.
co sa da aj v tej heitovanej jave, ci C#Tak se předveď, ne?
poradia so vstupmy od pouzivatela, ci ineho systemu, kde moze prist akakolvek blbost.Na tuto otázku tu již byla odpověď.
Kdybych tam cpal čísla ze vstupu, musel bych si to ověření sudosti (prfX) vyrobit sám a předat ho explicitně.
Tam ten kód funguje, zkus to zkopírovat ještě jednou do zdrojáku.
SuccSuccIsEven : IsEven n -> IsEven (2+n) -- fungujeversusSuccSuccIsEven : IsEven n -> IsEven (n+2) -- nefunguje 
Jakou máš verzi Idrisu? Funguje to v 0.6.0.IsEven musí mít typový parametr. A je to jen kontrakt, že ten parametr je sudé číslo. Nějak takto to bude fungovat:No tak to je teda hnusný zápisKód: [Vybrat]data IsEven : Nat -> Type where
ZIsEven : IsEven 0
SuccSuccIsEven : IsEven n -> IsEven (2+n)
sumx : (n : Nat) -> {auto 0 prf1 : IsEven n} -> (m : Nat) -> {auto 0 prf2 : IsEven m} -> Nat
sumx n m = n + m![]()
Pak mi musíš vysvětlit, proč to tam je.
Bohužel: "Can't find an implementation for IsEven 2."
IsEven musí mít typový parametr. A je to jen kontrakt, že ten parametr je sudé číslo. Nějak takto to bude fungovat:Kód: [Vybrat]data IsEven : Nat -> Type where
ZIsEven : IsEven 0
SuccSuccIsEven : IsEven n -> IsEven (2+n)
sumx : (n : Nat) -> {auto 0 prf1 : IsEven n} -> (m : Nat) -> {auto 0 prf2 : IsEven m} -> Nat
sumx n m = n + m
Pak mi musíš vysvětlit, proč to tam je.Takže ve výsledku jsem fanoušek přístupu, kdy se abstrakce vyvíjí trochu pomaleji, návrh jazyka zůstává nohama trochu více na zemi* a zároveň s tím se vyvíjí rovnou i schopnost produkovat pokudmožno optimální kód pro reálná CPU, protože to umožňuje ty zkušenosti s generováním strojového kódu reflektovat do návrhu těch abstrakcí, do návrhu IR reprezentací atd.
Chceš na to ještě nějak navázat? Otázky k tomuto konkrétnímu příkladu?
data IsEven : Nat -> Type where
ZIsEven : IsEven 0
SuccSuccIsEven : IsEven n -> IsEven (n+2)
sumx : IsEven -> IsEven -> IsEven
-- sumx : Int -> Int -> Int
sumx x y = x * y
main : IO ()
main = putStrLn $ "Hello: " ++ (show (sumx 2 4))
Rust je schopen zajistit, že nedojde k memory leaku.Tady nevim přesně jak to myslíš, ale absence leaků nepatří do záruk Rust safe kódu, leaking není unsafe. OTOH díky různým vlastnostem neleakující kód není nějak těžké psát.Je schopen Rust vunutit, aby text byl neprázdný?To je to samé jako utf8-korektnost, ne? Spíš rovnou vysvětli, kam tím míříš, a já zkusim líp odpovědět.
Je schopen Rust vunutit, aby text byl neprázdný? Haskell to umíA Idris to umí ještě lépe, nemusíš kvůli tomu definovat nový typ