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 ... 10 11 [12] 13 14 ... 153
166
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 01:52:50 »
Co znamená ta 0 mezi `auto` a jménem implicitního argumentu?
To je multiplicita (viz kvantitativní typový systém). Nula znamená erasure :)
Aha, ok. Dalo by se to principelně doplnit syntaxí s anonymním argumentem, něco jako `auto _ : IsEven n`? Anonymní arugment by nešlo ve funkci použít, tj. efektivně multiplicita 0. Edit: Resp. asi lepší syntaxe by byla `auto 0: IsEven n`.
Jo, to jde.

167
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 01:04:46 »
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
No tak to je teda hnusný zápis  :P :) Pak mi musíš vysvětlit, proč to tam je.

Bohužel: "Can't find an implementation for IsEven 2."
Jakou máš verzi Idrisu? Funguje to v 0.6.0.

idris2 --version # 0.6.0
Z idris2-0.6.0.tgz, stažený z webu, kompiluju na Fedoře.
Tam ten kód funguje, zkus to zkopírovat ještě jednou do zdrojáku.

168
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 00:56:06 »

169
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 00:50:31 »
Co znamená ta 0 mezi `auto` a jménem implicitního argumentu?
To je multiplicita (viz kvantitativní typový systém). Nula znamená erasure :)

170
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 00:40:28 »
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
No tak to je teda hnusný zápis  :P :) Pak mi musíš vysvětlit, proč to tam je.

Bohužel: "Can't find an implementation for IsEven 2."
Jakou máš verzi Idrisu? Funguje to v 0.6.0.

171
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 07. 12. 2022, 00:08:45 »
Kód: [Vybrat]
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))
Ještě mi něco schází vědět?: "Mismatch between: Nat -> Type and Type."
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

172
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 22:44:27 »
Třeba to forall mi přišlo poněkud složité oproti přímočarým rozhraním v průmyslových jazycích.
Ono je složitější, protože typové třídy mají typový parametr, kdežto rozhraní v Javě nebo Go ho mít nemusí. Jsou to rozdílné věci. Ale jak jsem psal, forall se dá zbavit použitím GADT.

173
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 21:49:31 »
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 ;)

174
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 19:24:01 »
Chceš na to ještě nějak navázat? Otázky k tomuto konkrétnímu příkladu?
Určitě ano, ale nyní mám povinnosti.
Večer.
Teď mě napadlo, jak jsi zmiňoval to tehdejší forall, že existenční typy jdou vyjádřit jednodušeji pomocí GADT.

175
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 16:23:52 »
já se snažil vždycky psát, že ty typové informace se vymažou (můžou vymazat), když nejsou potřeba. A když jsou potřeba, tak je samozřejmě třeba je neodstraňovat
Ono to je matoucí, protože k type erasure dochází vždy (v tom smyslu, že tam není žádný reifikovaný typ Vect nebo Matrix, tj. instance neví, jakého jsou typu), ale používané typové parametry se předávají přímo funkcím, které je potřebují.

176
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 15:54:01 »
Ano, indukční definice typu sudá čísla je pěkná ukázka. A v dalším kódu už pak opravdu můžeme mít jenom krásné garantované sudé číslo a optimalizátor tu informaci může pěkně využít.

Jenže co se stane, když načtete uživatelský vstup a bude tam číslo liché? Nějaký implicitní nebo explicitní parser musí rozhodnout, jestli ta hodnota je v pořádku nebo není a nějak zareagovat. A to je část, co se z ukázek síly funkcionálního programování typicky vypouští.
Naopak!
To je na tom právě to kouzelné, že staticky typované jazyky tě přinutí, aby si zohlednil situaci když je to číslo liché. To je právě ta smetana, po které toužíme. Garance.
Přesně tak.

177
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 15:18:56 »
Na stránce o memory managementu mají hezkou ukázku, jak move semantics v jazyce bez GC potřebují od typového systému
Jako v Mercury. Jo, mít u typů multiplicitu se hodí.


178
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 12:00:08 »
Tam bude zajímavější i ten vygenerovaný kód, protože s typem Nat se pojí zajímavé optimalizace.
Hořím zvědavostí...
Však si to přelož.

179
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 11:43:46 »
parametr tam můžeme zpropagovat, pokud to potřebujeme, pomocí této fíčury ('implicit arguments')
Je rozdíl mezi type erasure a type parameter erasure ;)
Ale už to uzavřeme, myslím, že teď už je všem jasné, jak to funguje. V čem má smysl pokračovat je ten příklad s GADT pro IsEven. Tam bude zajímavější i ten vygenerovaný kód, protože s typem Nat se pojí zajímavé optimalizace.

180
Vývoj / Re:Je Rust jazyk budoucnosti?
« kdy: 06. 12. 2022, 11:09:10 »
bylo by možné to opravdu udělat bez runtime prostě zpropagováním toho parametru jako běžného parametru funkce.
To je přece princip těch tzv. implicitních parametrů (těch ve složených závorkách). Proto se může dělat type erasure (Vect nebo Matrix tam nikde není). Koukám, že už to začínáš chápat, to je fajn, diskuse nese ovoce.

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