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 - Mirek Prýmek

Stran: 1 ... 264 265 [266] 267 268 ... 618
3976
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 10. 07. 2015, 07:41:29 »
Správne, pokiaľ si taký jazyk nedefinujeme, tak neexistuje a nemá zmysel hovoriť o jeho vlastnostiach. To by sa zmenilo v okamihu, keby sme taký jazyk definovali. V tomto prípade by zrejme nasledovala obšírna definícia runtime prostredia schopného vykonávať C-čkovské programy. (A kvôli zamedzeniu nedorozumeniam by sme ho z BLB/C premenovali na BLBOST.)
I když si to nadefinuješ jak chceš, jsou jenom dvě možnosti:

1. celou syntax a sémantiku jazyka C zahrneš do definice jazyka BLBOST => jazyk BLBOST nemůže být pure, protože C není.

2. nezahrneš - jazyk BLBOST má prostě opravdu jenom return a string. Obsah stringu neřeší => jazyk BLBOST je pure, ale neumí dělat IO, neumí zkontrolovat korektnost toho C programu atd.

3977
Vývoj / Re:SHA 512 dostačující?
« kdy: 09. 07. 2015, 11:11:56 »
Tohle taky veřejně nepřiznali a vesele to používali: https://en.wikipedia.org/wiki/EFF_DES_cracker
Dneska to jistě není jinak.
Něco jinýho je bruteforcovat a něco jinýho mít v algoritmu nedokonalost/zranitelnost/zadní vrátka.

3978
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 09. 07. 2015, 00:54:12 »
Tú otázku som tam dal preto, lebo som si nebol (a stále si nie som) istý, či sa zhodneme na čistote jazyka C/FPP. (Samozrejme, stále som si vedomý toho, že FPP nebol poriadne definovaný.)
Ale C/FPP není žádný jazyk. Jazyk je buď C nebo FPP. Představ si, že bys měl jazyk BLB, který by měl jediný typ: string a jedinou operaci: RETURN. A pak bys v něm napsal takovýhle program:

Kód: [Vybrat]
RETURN '
void f() {
  puts("Hola hola hola\n");
}

int main () {
  f();
  return 0;
}
'

Znamená to snad, že "jazyk BLB/C" má funkce? Že umí vypsat něco na výstup? Ne. Žádný jazyk BLB/C neexistuje, tím míň se dá mluvit o nějakých jeho vlastnostech.

3979
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 10:39:33 »
V C/C++ nelze neužít zásobník. Míra jeho využití je daná rozmary tvůrců kompilátoru, viděl jsem kompilátor co dělá push/pop i uvnitř FOR.

Citace
A small comment: Even though the C++ solution corresponds to a recursive function in Haskell, it isn't actually recursive. The Loop is not calling itself -- it creates a new Loop object. You can run this code under the debugger and see that the program's stack is not growing. Neither is heap space for that matter -- the Loop objects are constantly recycled.
https://www.fpcomplete.com/blog/2012/06/asynchronous-api-in-c-and-the-continuation-monad

3980
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 09:52:33 »
neexistuje žádná obrana před tím proč by zrovna ve Vašem kódu nemohlo nastat přetečení zásobníku.
Existuje - ten zásobník prostě nevyužíváš. Triviální příklad: místo rekurze dáš for.

Tomu všemu rozumím, jen mi to přišlo legrační :)
Co je na tom legračního?

3981
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 09:40:18 »
Ale hodí se.
Jasan. Myslel jsem, že ho nepotřebuješ pro normální IO.

3982
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 09:38:28 »
Tento zdroják (presnejšie by sme mali povedať: dátová štruktúra jazyka C/FPP) je potom spracovaný v runtime systéme, ktorý môže byť z dôvodov efektívnosti realizovaný prekladom do strojového kódu.
Dobře, ale nerozumím romu, co se snažíš říct, kam se chceš dobrat.

Ináč som si nie istý, či som ťa správne pochopil: tým čistým funkcionálnym jazykom nazývaš len FPP alebo C/FPP?
FPP je čistý, to jsme si dali do definice. FPP produkuje string, který se dá interpretovat jako zdroják v C, což čistý jazyk není.

Nevím, jakou tam hledáš záludnost. Říkal jsem to proto, že stejným způsobem runtime Haskellu interpretuje ty IO instrukce, což je taky jenom nějaká datová struktura (jako ten string) a úplně stejným způsobem z toho NEplyne, že Haskell není čistý jazyk.

3983
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 02:41:38 »
Na spôsob vyššie spomínaného C/FPP. (Som si vedomý toho, že časť za lomítkom nebola presne špecifikovaná.)
Ok, takže máme nějaký čistý funkcionální jazyk, jehož jediným možným výstupem je text - konkrétně syntakticky správný C zdroják. A dál? Co s tím?

3984
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 02:36:08 »
Identita je funkce. O funkcí nemůžu říct, že je functor, to řeknu o typu.
Přesněji o typovém konstruktoru s kindem (jak se to řekně česky?) * -> * :)

Myslel jsem to tak, že by fmap byl identita, jenže to vlastně v Haskellu taky nejde, to je pech :)

Nevím, co si představuješ pod ne-box functorem, ale nemohla by to být třeba funkce?
Kód: [Vybrat]
    instance Functor ((->) r) where  
        fmap f g = (\x -> f (g x)) 
Jo, to by asi mohla :) Hlavně že jsem se na tu kapitolu v LYAH, kde je přesně tohle,  před chvilkou ještě koukal :)) Dík!

3985
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 02:03:44 »
...a dá se to říct i ještě abstraktněji: functor nemusí být ani žádný "box na hodnoty", je to prostě endofunctor ;)
...teď jsem teda mocně zavařoval závity a přemýšlel nad tím, jestli by v Haskellu mohl být i nějaký ne-box functor a nic mě nenapadlo, kromě identity, což je vlastně takový null-box. Takže to asi nebyl úplně dobrý příklad :))

Ale kdybys měl možnost introspekce obecné funkce a mohl nějak přiohnout ji, místo té vstupní a výstupní hodnoty... Možná by to nějak i šlo. Ale asi teda spíš ne :))

3986
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 01:43:04 »
Myslím, že už tě chápu.
Ono by se to asi dalo říct i tak, že požaduješ nějakou vlastnost, která ale z definice nevyplývá. Nemusíme jít do monády, stačí nám funktor, ten je definovanej takhle:

Kód: [Vybrat]
class Functor (f :: * -> *) where
  fmap :: (a -> b) -> f a -> f b
- tam nikde nemáš řečený, že musí existovat způsob, jak můžeš z toho "boxu" tu hodnotu vytáhnout. To udělá implementace fmap pro konkrétní functor za tebe a opět ti vrátí jenom box, do kterýho se podívat nemůžeš, protože jeho strukturu obecně nemusíš znát. To, že ji u Maybe znáš a tímpádem můžeš tu hodnotu vytáhnout pattern matchingem je nějaká informace navíc, kterou obecně definice Functoru nezaručuje.

...a dá se to říct i ještě abstraktněji: functor nemusí být ani žádný "box na hodnoty", je to prostě endofunctor ;) https://en.wikipedia.org/wiki/Functor

3987
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 01:31:59 »
Tak ho tak prostě definujeme, stačí jenom přidat IO monádu, a máme pure C. Nebo si můžeme udělat nový jazyk PureC s vlastní definicí se základem v Cčku. Nejlepší na tom je, že nebudeme muset psát jiný kompiler. Je to jen hra se slovy.
Věta "přidáme tam monádu a máme pure X" je stejně nesmyslná jako "přidáme tam <cokoli jinýho> a máme pure X". Purity není dáno tím, jestli jazyk má nebo nemá monády. Monády jsou NÁSTROJ, jak V ČISTÉM JAZYCE něco udělat. V nečistém jazyce tento nástroj

1. nepotřebuješ

2. z nečistého jazyka ti čistý neudělá

Vždyť se všichni shodujeme na definici "v čistém jazyce dvě volání vždy dávají stejný výsledek". Tak jestli chceš dokazovat, že Haskell není čistý, tak ukaž, jaké dvě fce můžou dát se stejnými argumenty jiný výsledek a je to, ne? Proč se babrat v čemkoli jiným, ne?

3988
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 01:28:45 »
O runIO nejde. Jde o to, že nejde udělat substituci výrazu.
Reagoval jsi na příspěvek, ve kterém jsem říkal, proč runIO v Haskellu nemůže existovat. Proto o něm mluvím.

Jazyk je čistý, pokud mohu, mimo jiné, provádět nahrazení výrazu její hodnotou
Souhlas. Ekvivalentně: pokud každé volání stejné funkce se stejnými parametry dá tentýž výsledek.

Když budu mět kdekoliv v kódu číslo, tak ho mohu bezezbytku přetavit na Maybe monádu. A naopak. Zatímco když budu mět to samé v IOMonádě, tak se jí, jako jediné, nezbavím. A při všech transformacích ji tam budu tahat jak vocásek. To znamená, že ta substituce se provede - ale s ocáskem. A možná proto bych ji za čistou neprohlásil.
Já pořád nějak nechápu, kde vidíš problém. Pokud fce vrací IO Int, tak prostě vrací nějaká data. Pokaždé stejná pro stejné argumenty. A přesně tak to má být. Kde je problém?

3989
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 01:22:44 »
Referenčně transparentní.
Co je referenčně transparentní? Referenčně transparentní může být jenom JAZYK.

Typ "IO Int" je prostě datový typ. Proměnná "a" typu "IO Int" jsou prostě nějaká DATA. Představ si to tak, že ta data je string s instrukcemi pro IO, třeba: "Načti další byte ze souboru f". Pokud bys měl funkci runIO, tak ji zavoláš poprvé:

runIO a = runIO "Načti další byte ze souboru f" = Byte1

...a podruhé:

runIO a = runIO "Načti další byte ze souboru f" = Byte2

Totéž volání fce "runIO" s týmž argumentem "a" ti dalo různý výsledek. A to se v čistém jazyce nesmí stát. Proto runIO v Haskellu nemůže existovat.

3990
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 01:11:43 »
A proč by vrátilo runIO něco jiného při opakovaném volání. IO monáda je přece čistá.
Definuj "IO monáda je čistá". Striktně a přesně.

Stran: 1 ... 264 265 [266] 267 268 ... 618