Rychlost Haskell vs. C++

andy

Re:Rychlost Haskell vs. C++
« Odpověď #240 kdy: 01. 09. 2018, 11:25:13 »
A pokud jde o termín "vrací", tak v haskellu se nevrací.  V haskellu se nějaká část výrazu vyhodnotí na něco jiného. Ale tak pro zjednodušení můžeme pojem "vrací" definovat jako "vyhodnotí se na hodnotu".


lopata

Re:Rychlost Haskell vs. C++
« Odpověď #241 kdy: 01. 09. 2018, 11:34:07 »
Ale pořád jsme se nedostali k tomu, co TY považuješ za korektní. Je to tohle?
Už jsem to psal. Korektní program je takový, který dává výstup dle pożadavků uživatele. Je úplně jedno, jak je interně implementovaný. Pokud je uživatel s výstupem spokojen a program je deterministický (ve smyslu nezávisí na undefined behavior), potom je korektní. Jestli máš jinou definici korektní, tak se asi neshodneme.

A máš pravdu, že ten můj program je uvnitř implementovaný divoce a závisí na tom, že div vyhazuje aritmetickou výjimku, ale to uživatele nezajímá. Všechno, co ten program dělá, je v Haskellu garantované, ten program nezávisí na ničem unsafe. Při strict vyhodnocení dává deterministické výsledky, se kterými je uživatel spokojen, je tedy korektní, dělá přesně to, co má dělat, dle požadavků uživatele.

andy

Re:Rychlost Haskell vs. C++
« Odpověď #242 kdy: 01. 09. 2018, 11:38:52 »
Ale pořád jsme se nedostali k tomu, co TY považuješ za korektní. Je to tohle?
Už jsem to psal. Korektní program je takový, který dává výstup dle pożadavků uživatele. Je úplně jedno, jak je interně implementovaný. Pokud je uživatel s výstupem spokojen a program je deterministický (ve smyslu nezávisí na undefined behavior), potom je korektní. Jestli máš jinou definici korektní, tak se asi neshodneme.
Evaluation error - odpověď na otázku "Je to tohle?" Obashuje možnosti ANO a NE....

Citace
A máš pravdu, že ten můj program je uvnitř implementovaný divoce a závisí na tom, že div vyhazuje aritmetickou výjimku, ale to uživatele nezajímá. Všechno, co ten program dělá, je v Haskellu garantované, ten program nezávisí na ničem unsafe. Při strict vyhodnocení dává deterministické výsledky, se kterými je uživatel spokojen, je tedy korektní, dělá přesně to, co má dělat, dle požadavků uživatele.
Při vyhodnocování toho programu se nám trošku přehřál reaktor. Ale nevadí, tepelné pojistky to zastavily, takže se ve výsledku nic nestalo. Program pracuje korektně...


lopata

Re:Rychlost Haskell vs. C++
« Odpověď #243 kdy: 01. 09. 2018, 11:46:22 »
To co teď předvádíš, je demagogie. K žádnému přehřátí reaktoru ani ničemu podobnému nedochází. Já chápu, že se ti ten program nelíbí, mně taky ne. Ale to ho nedělá nekorektní. Uživatel potřebuje vědět, zda lze daným číslem dělit a ten program při strict vyhodnocení přesně plní jeho požadavky, je tedy korektní.

andy

Re:Rychlost Haskell vs. C++
« Odpověď #244 kdy: 01. 09. 2018, 16:37:11 »
To co teď předvádíš, je demagogie. K žádnému přehřátí reaktoru ani ničemu podobnému nedochází. Já chápu, že se ti ten program nelíbí, mně taky ne. Ale to ho nedělá nekorektní. Uživatel potřebuje vědět, zda lze daným číslem dělit a ten program při strict vyhodnocení přesně plní jeho požadavky, je tedy korektní.
Ne, reaktor se nepřehřál, teplotní pojistky to zastavily..takže program běžel korektně. Ne, program nespadnul, sandbox jménem "catch" zabránil zhroucenému evaluátoru, aby sundal celý program. Ne, z funkce nemůžeš "vrátit" bottom....

Jinak Undefined... ptal jsem se tě, zda souhlasíš s tou větou ohledně korektnosti a ... nedříve type error, jiná odpověď teď bottom.....


andy

Re:Rychlost Haskell vs. C++
« Odpověď #245 kdy: 01. 09. 2018, 18:59:41 »
A jinak ohledně korektnosti - ja následující program korektní? Když vypneš type-checking, tak jde přeložit:
Kód: [Vybrat]
import Control.Exception (catch, TypeError(..), evaluate, try)

message :: String
message = "hello" ++ (1 :: Int)
main = do
  res <- try (evaluate $ message `seq` message)
  case res of
      Left (TypeError msg) -> putStrLn "Presne tohle uzivatel ocekaval."
      Right s -> putStrLn s

Já bych řekl, že korektní není, protože specifikace říká něco o tom, že tam nesedí typy. Ale přesto je to chování naprosto deterministické a v dokumentaci popsané (taky nové, takže v dokumentaci GHC - ale popsané) a uživatel je spokojený. To, že specifikace některé typy programů nebo stavů považuje za chybné (třeba za tím účelem, aby pak Strict -> Lazy nic nerozbilo) vypadá, že je zcela irelevantní....

lopata

Re:Rychlost Haskell vs. C++
« Odpověď #246 kdy: 02. 09. 2018, 00:00:34 »
Ne, reaktor se nepřehřál, teplotní pojistky to zastavily..takže program běžel korektně. Ne, program nespadnul, sandbox jménem "catch" zabránil zhroucenému evaluátoru, aby sundal celý program. Ne, z funkce nemůžeš "vrátit" bottom....

Jinak Undefined... ptal jsem se tě, zda souhlasíš s tou větou ohledně korektnosti a ... nedříve type error, jiná odpověď teď bottom.....

Nechápu, co se snažíš říct? Že má ten program chytající výjimky špatný design? To je přece jasné, že ano, to všichni víme. Nicméně z formálního hlediska je korektní. Dává ve strict variantě výsledky, které jsou správné a deterministcké. Jak dlouho to ještě chceš řešit?

Pořád tady píšeš o nějakém padání programu, ale to je úplně mimo. Bottom v Haskellu ve smyslu výjimky není žádný pád programu. Dovol, abych si vypůjčil jednu větu odsud: https://www.reddit.com/r/haskell/comments/7wblve/exceptions_in_pure_functions/dtzeu8y/
Bottom is not a real value. It is not even a special expression which crashes the program when evaluated. Instead, it is a mathematical value we use to talk about expressions which diverge or throw exceptions, such as length [0..], undefined, error myErrorMessage, and throw myException.

Vyhození výjimky a její chytání je jasně specifikovaná funkcionalita, žádný pád programu. Má to definované chování. Nejenom v Haskellu se řeší dělení nulou často jako výjimka. Nikdo se nad tím nepozastavuje a nepřemýšlí, jestli tu výjimku může nebo nemůže chytit. Protože může a je to relevatní a definované řešení problému.

andy

Re:Rychlost Haskell vs. C++
« Odpověď #247 kdy: 02. 09. 2018, 10:18:14 »
Diskuze spočívá v tom, že obě strany diskuze předkládají nějaká tvrzení a druhá strana na ně reaguje, a případně vysvětluje, že s nimi souhlasí/nesouhlasí, případně proč. Ne, že jedna strana opakuje nějaké tvrzení - a je jedno jestli nakonec pravdivé nebo nepravdivé, a na tom prostě "trvá". To je pozice židle, ta taky prostě stojí na místě. Diskuze s židlí nemá smysl.

Haskell je matematický zápis. Například následující v R:
Kód: [Vybrat]
sqrt(-3)je nekorektní. Je to stejně nekorektní, jako třeba:
Kód: [Vybrat]
sqrt("hello world")Proč? Protože funkce druhá odmocnina má definiční obor (v R) "x v R, x >= 0". To znamená, že když napíšeš něco z toho výše, tak je to prostě nesmysl. A je úplně jedno, jestli ten program se následně chová deterministicky nebo ne. Je prostě blbě. Formálně blbě a věcně blbě.

Mně totiž připadá, jako kdybys pocházel z oblasti "programování CPU". Assembler totiž nic nevyjadřuje, kromě popisu toho, co to CPU má udělat. Takže jediné, co tě zajímá, je jestli je ten výsledný kód nějakým způsobem podle specifikace deterministický. Jenže od dob assembleru jsme jaksi upgradovali (už dávno...) a teď například překladači sdělíš nějakou specifikaci a tu specifikaci po té implementuješ. Nesoulad tebou dodané specifikace s implementací je vadný program. A je úplně jedno, jestli se ten program následně chová deterministicky.

A tedy k diskuzi - položil jsem několik otázek, několikrát ti vysvětlil, proč je ten kód nekorektní. No reaction. Takhle se chová židle. Takže ti to tady shrnu a pokud se nebudeš namáhat na to nějakým způsobem reagovat, pak je myslím zřejmé, že normálně trolíš a nebo na to prostě nemáš.

Souhlasíš s tímto tvrzením? Obor hodnot odpovědi je: ANO a NE.
Citace
Pokud jazyk obsahuje deterministické a plně specifikované rutiny pro handling nekorektních stavů programů a neobsahuje konstrukce s nedefinovaným chováním, pak v něm nelze napsat nekorektní program.

Vysvětlení, proč je kód nekorektní: Ve specifikaci funkce catch a po typové inferenci vychází, že jako první parametr očekává hodnotu typu "IO ()". To je specifikace. Implementace této specifikaci neodpovídá. Souhlas? Obor odpovědi: ANO/NE, pokud ne, tak prosím vysvětlení proč.

Tvůj pojem "korektnosti" naprosto ignoruje, že specifikace jazyka říká, že něco není korektní. Například v Haskellu musí sedět typy parametrů při volání funkcí. Následujcí program lze zkompilovat s parametrem GHC "-fdefer-type-check". Ten program normálně běží, zcela deterministicky. Naprosto neodpovídá typovým pravidlům haskellu. Je to podle tebe korektní nebo nekorektní program? Obor hodnot odpovědi: ANO/NE, pokud ANO, tak by mě zajímalo proč.
Kód: [Vybrat]
import Control.Exception (catch, TypeError(..), evaluate, try)

message :: String
message = "hello" ++ (1 :: Int)
main = do
  res <- try (evaluate $ message `seq` message)
  case res of
      Left (TypeError msg) -> putStrLn "Presne tohle uzivatel ocekaval."
      Right s -> putStrLn s

Jinak mám z diskuze s tebou pocit, jako mají asi fyzici vysvětlující kvantovou fyziku. Jak jako že může být jedna částice na víc místech...? Částice je vždycky někde, má konkrétní váhu a rychlost a dá se to změřit.

andy

Re:Rychlost Haskell vs. C++
« Odpověď #248 kdy: 02. 09. 2018, 10:21:04 »
A asi bych si měl udělat účet, abych se moh zpětně opravovat:
Citace
....Naprosto neodpovídá typovým pravidlům haskellu. Je to podle tebe korektní nebo nekorektní program? Obor hodnot odpovědi: ANO/NE...

Re:Rychlost Haskell vs. C++
« Odpověď #249 kdy: 02. 09. 2018, 10:49:58 »
Je v něm typová chyba: vrací se bottom tam, kde se očekává typ, který bottom neobsahuje. Haskell tento typ chyby není schopen odhalit při překladu, slítne to v runtimu.
Neslítne to. Haskell language report někde říká, že když se vrátí bottom, je to nedefinované chování? Neříká. Vyhodí to ArithException, která se dá chytit. Haskell to umožňuje a je to definované chování. Já chápu, že se ti nelíbí, jak je to udělané a že tu výjimku chytám. Mně se to taky nelíbí, dělám to z toho důvodu, protože jsi tvrdil, že v Haskellu nemůže existovat program, který závisí na strict vyhodnocení. Může.

Úplně stejný argument je, že když dereferencuju NULL pointer v C, tak ten SIGSEGV můžu taky odchytit, tudíž je to v pořádku. Jsi trotl, nebo to myslíš vážně?

De facto jsi napsal program, který jde popsat takto "jsi-li ve strictu, vrať toto, jinak spadni/vypiš toto", pointou ale je, že ti minimálně nesedí typy... :)

andy

Re:Rychlost Haskell vs. C++
« Odpověď #250 kdy: 02. 09. 2018, 10:56:19 »
De facto jsi napsal program, který jde popsat takto "jsi-li ve strictu, vrať toto, jinak spadni/vypiš toto", pointou ale je, že ti minimálně nesedí typy... :)
Opačně  ;) Jsi-li ve strictu, spadni/vypiš toto, jinak vrať toto...

Re:Rychlost Haskell vs. C++
« Odpověď #251 kdy: 02. 09. 2018, 12:21:10 »
De facto jsi napsal program, který jde popsat takto "jsi-li ve strictu, vrať toto, jinak spadni/vypiš toto", pointou ale je, že ti minimálně nesedí typy... :)
Opačně  ;) Jsi-li ve strictu, spadni/vypiš toto, jinak vrať toto...

Ten spánek se občas asi hodí... :D Ne, máš pravdu, ale pointa je snad jasná. :)

Bacsa

Re:Rychlost Haskell vs. C++
« Odpověď #252 kdy: 02. 09. 2018, 12:37:38 »
Kód: [Vybrat]
sqrt(-3)je nekorektní. Je to stejně nekorektní, jako třeba:
Kód: [Vybrat]
sqrt("hello world")Proč? Protože funkce druhá odmocnina má definiční obor (v R) "x v R, x >= 0". To znamená, že když napíšeš něco z toho výše, tak je to prostě nesmysl
To poukazuje na důležitost typů (well-typed programs), klidně bych taky mohl mít sqrt nad C, kde to bude dobře.

Bacsa

Re:Rychlost Haskell vs. C++
« Odpověď #253 kdy: 02. 09. 2018, 12:39:30 »
Jinak mám z diskuze s tebou pocit, jako mají asi fyzici vysvětlující kvantovou fyziku. Jak jako že může být jedna částice na víc místech...?
Takové analogie si může dovolit používat fyzik, takhle jen matou a ruší diskusi.

lopata

Re:Rychlost Haskell vs. C++
« Odpověď #254 kdy: 03. 09. 2018, 03:09:02 »
Úplně stejný argument je, že když dereferencuju NULL pointer v C, tak ten SIGSEGV můžu taky odchytit, tudíž je to v pořádku. Jsi trotl, nebo to myslíš vážně?
Už jsem ti to psal asi 100x. Dereference NULL pointeru je UNDEFINED BEHAVIOR. NULL pointer NEMŮŽEŠ derefenrencovat, protože nemáš zaručeno vůbec nic, může se stát cokoliv. Výjimku v Haskellu chytat můžeš, protože máš zaručeno, co se stane, je to definované. Jsi opravdu tak hloupý, nebo jenom nechceš takovou základní věc pochopit?