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:
sqrt(-3)
je nekorektní. Je to stejně nekorektní, jako třeba:
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.
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č.
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.