Funkcionální programátor

Re:Funkcionální programátor
« Odpověď #135 kdy: 30. 06. 2015, 21:51:10 »
A takové pěkné úteý to mohlo bejt ...


v

Re:Funkcionální programátor
« Odpověď #136 kdy: 30. 06. 2015, 21:55:57 »
import Control.Monad.State

f = evalState g 0
   where g = do
      a <- get
      put 1
      b <- get
      return (a, b)

main = print f

vypíše (0,1), tj. get vrátí pokaždé jinou hodnotu, přesto je f čistá funkce, čarodějnictví?!

dále k tématu: https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect

Re:Funkcionální programátor
« Odpověď #137 kdy: 01. 07. 2015, 00:34:28 »
každý kdo si myslí že je možné něco jako forkWorld v Cleanu je debil který nepochopil ani první větu na wiki o UT
Ne, ty jsi nepochopil ten argument:

1. Haskell záměrně umožňuje jakousi (dle tebe) prasárnu, aby umožnil něco, co by jinak nebylo možné
2. Kdyby Clean chtěl umožnit to samé, pak by musel umožnit tu samou prasárnu (a tím by opustil tu čistotu, v tom máš pravdu)
3. Kdyby[/b] chtěl být Haskell čistý, tak by tu prasárnu neumožnil.

Všimni si prosím, že "pak by musel umožnit" není totéž jako "umožňuje".

(netvrdím, že to takhle je, na to znám Haskell málo, jenom reprodukuju ten argument, jak jsem ho pochopil já)

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Funkcionální programátor
« Odpověď #138 kdy: 01. 07. 2015, 01:36:40 »
Jsem čumila pochopil tak, že dotyčná prasárna v Haskellu udělat jde, protože to stačí naimplementovat, zatímco v Cleanu to nejde, protože by se musel komplet přepracovat idea typového systému.

JSH

Re:Funkcionální programátor
« Odpověď #139 kdy: 01. 07. 2015, 07:14:59 »
Jsem čumila pochopil tak, že dotyčná prasárna v Haskellu udělat jde, protože to stačí naimplementovat, zatímco v Cleanu to nejde, protože by se musel komplet přepracovat idea typového systému.
Ale v cleanu to taky stačí jenom naimplementovat. To, že to zatím naimplementované není, umožňuje čumilovi snít o tom, že tomu typový systém nějak brání. Brání tomu úplně stejně jako monády, tzn. pro spuštění vlákna je třeba funkce, která ten typový systém obejde.

On si čumil pořád nějak odmítá připustit že unique typing dělá to samé jako monády. Zavírá kód s vedlejšími efekty do klece, aby se udržel na jednom místě a zbytek programu zůstal čistý. I ty mutable proměnné tam jdou bez problémů implementovat současnými prostředky (žádné FFI ani změny runtime, čistě v cleanu) bez nějakého brutálního znásilnění nevinného jazyka.


Radek Miček

Re:Funkcionální programátor
« Odpověď #140 kdy: 01. 07. 2015, 10:24:56 »
Jsem čumila pochopil tak, že dotyčná prasárna v Haskellu udělat jde, protože to stačí naimplementovat, zatímco v Cleanu to nejde, protože by se musel komplet přepracovat idea typového systému.

Typový systém je jen sada odvozovacích pravidel. Do UT lze forkWorld přidat jednoduše - do jazyka stačí přidat konstantu forkWorld a typový systém rozšířit o pravidlo (axiom), které jí přiřadí typ.

Mj. úplně stejným způsobem se do jazyka a jeho typového systému přidávají například čísla, n-tice (produkty) nebo sumy. Stejným způsobem lze do jazyka přidat i funkci coerce pro přetypování. Viz například Type systems for programming languages, kapitola 3.6 Simple extensions.

čumil

Re:Funkcionální programátor
« Odpověď #141 kdy: 01. 07. 2015, 10:37:23 »
každý kdo si myslí že je možné něco jako forkWorld v Cleanu je debil který nepochopil ani první větu na wiki o UT
Ne, ty jsi nepochopil ten argument:

1. Haskell záměrně umožňuje jakousi (dle tebe) prasárnu, aby umožnil něco, co by jinak nebylo možné
2. Kdyby Clean chtěl umožnit to samé, pak by musel umožnit tu samou prasárnu (a tím by opustil tu čistotu, v tom máš pravdu)
3. Kdyby[/b] chtěl být Haskell čistý, tak by tu prasárnu neumožnil.

Všimni si prosím, že "pak by musel umožnit" není totéž jako "umožňuje".

(netvrdím, že to takhle je, na to znám Haskell málo, jenom reprodukuju ten argument, jak jsem ho pochopil já)
Clean tu prasárnu nemůže provést proboha ... forkIO neporušuje typový systém a ani pravidla monád. Něco jako forkWorl v UT ale porušuje pravidla UT a tím pádem i typový systém. Proboha, musím to psát furt dokolečka jen proto že ňákýho tydýta napadlo, že ačkoli se o tom dozvěděl před 2 dni poprvé, už to plně chápe a může rozdávat moudrost ...

ALE mimochodem, je bezvadné že už z toho konečně některým vyplynulo že Haskell rozhodně není pure a lže.

čumil

Re:Funkcionální programátor
« Odpověď #142 kdy: 01. 07. 2015, 10:38:54 »
Jsem čumila pochopil tak, že dotyčná prasárna v Haskellu udělat jde, protože to stačí naimplementovat, zatímco v Cleanu to nejde, protože by se musel komplet přepracovat idea typového systému.
HALELUJA :) ostrůvek porozumnění

čumil

Re:Funkcionální programátor
« Odpověď #143 kdy: 01. 07. 2015, 10:53:28 »
Takže já už to teda nějak za sebe uzavřu. Už doopravdy. Jednou jeden slavný člověk řekl velmi moudrou větu.

"Není horší hádky, než hádky s idiotem, napřed vás stáhne na svou úroveň a poté umlátí zkušenostmi"

Je to strašně nadčasové mpudro, a já už začínám cítít, že kdybych se tady dál snažil stát v cestě té ignoranci, postupně bych byl na tu úroveň stáhnut a umlácen zkušenostmi. Takže už v zájmu sebe to tady musím opustit.

Snad si někteří anonymní čtenáři přečetly co sem napsal, nemusí tomu hned věřit, stačí, když si o metodách o kterých jsem mluvil něco sami nastudují, zamyslí se jak fungují, a třeba si znovu projdou CO vlastně to FP originálně je. Dřív nebo později mi dají za pravdu. Ale ne hned, člověk nad tím musí přemýšlet, a musí nad tím přemýšlet tak, že hledá proč to funguje a ne proč to nefunguje jako tady pánové JSH a Radek.

Dřív jsem si myslel že Haskell je skutečně čistý, ale to IO mi stejně připadalo takové, divné. Nechápal jsem, jak to může být čisté. Až poté, co jsem napsal větší projekt v Haskellu, a měl sem tu možnost se do jazyka a jeho systému trochu hlouběji ponořit, začal jsem tušit, že on ani čistý není. Vlastně mne nakoply měnitelné reference, ty mi přišli divný, ale ještě divnější bylo, že sem se jim prostě nemohl vyhnout.

Tak to je vše, někdy přístě v jiném vlákně, se třeba pude bavit o tom, proč to funguje, a ne proč to nefunguje ...

JSH

Re:Funkcionální programátor
« Odpověď #144 kdy: 01. 07. 2015, 10:56:34 »
... forkIO neporušuje typový systém a ani pravidla monád. ...
Zeptám se znova. Jak bys rozdvojil RealWorld bez podpory, která umožňuje ty monády rozbalit?

Kdybys chtěl v cleanu plnotučná vlákna, tak prostě runtime bude muset podporovat funkci
forkIO :: (*World -> *World) *World -> *World
Ta funkce udělá naprosto to samé, co forkIO v Haskellu :
1) Vybalí World z krabice. Je úplně jedno jestli je tu krabici dělá IO Monád, nebo unique typ
2) Zkopíruje World a oba dva zase zabalí
3) Spustí další vlákno s jednou kopií světa.
Unikátní typy tomu brání úplně stejně jako monády : Je nutné je s podporou jazyka/runtime obejít úplně stejně jako ty monády

A připomínám ti, že s pomocí souborů se dá bez jakékoliv podpory na úrovni runtime implementovat IORef. Takže unikátní typy brání zabraňují vytváření mutable proměnných úplně stejně jako monády. Nijak

JSH

Re:Funkcionální programátor
« Odpověď #145 kdy: 01. 07. 2015, 11:21:34 »
A ještě zdůrazním proč
2) Zkopíruje World a oba dva zase zabalí
nemusí porušovat unikátní typování.

Vzhledem k tomu, že World je "fake" objekt jen k řazení vedlejších efektů, není třeba ho kopírovat. Stačí vytvořit nový, který je úplně nezávislý na tom prvním. Je to úplně stejné jako když z jednoho unique souboru načtu jméno druhého a vytvořím druhý nezávislý unikátní soubor. Na oba dva můžu mít jenom jednu jedinou referenci a z pohledu typového systému jsou úplně nezávislé.

Stejně tak forkIO v Haskellu vytváří druhý úplně nezávislý IO objekt a z pohledu jazyka ty dva nemají nic společného.

Radek Miček

Re:Funkcionální programátor
« Odpověď #146 kdy: 01. 07. 2015, 11:27:10 »
Něco jako forkWorl v UT ale porušuje pravidla UT a tím pádem i typový systém.

forkWorld pravidla UT neporušuje. Lze maximálně říci, že UT neobsahuje pravidla pro otypování forkWorld, ale stejně tak neobsahuje pravidla pro otypování 1 + 1 nebo jiných výrazů, které se v jazyce Clean používají. Důvodem je, že UT nezná konstanty 1, forkWorld a +. Jak jsem naznačil, UT si můžete o tyto konstanty rozšířit.

Může se stát, že takové rozšíření nebude konzervativní.

Citace
Ta první věta je "In computing, a unique type guarantees that an object is used in a single-threaded way, with at most a single reference to it." Ano, forkWorld by udělal dvě reference a tím by bylo porušeno pravidlo UT (a objekt by byl použit v multi-threaded way).

Věta "In computing, a unique type guarantees that an object is used in a single-threaded way, with at most a single reference to it.", není pravidlo UT, je to vlastnost pravidel UT. Přidání nových pravidel může tuto vlastnost zneplatnit, ale to neznamená, že by nová pravidla byla v rozporu s těmi starými.


Inkvizitor

Re:Funkcionální programátor
« Odpověď #148 kdy: 01. 07. 2015, 14:34:39 »
http://www.rarous.net/weblog/448-deset-duvodu-proc-nepouzivat-funkcionalni-jazyky.aspx
 ;)

To je aspoň vhled odborníka. Ten má tydlencty typový systémy a referenční transparenty v malíčku.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Funkcionální programátor
« Odpověď #149 kdy: 01. 07. 2015, 20:06:31 »
Jsem čumila pochopil tak, že dotyčná prasárna v Haskellu udělat jde, protože to stačí naimplementovat, zatímco v Cleanu to nejde, protože by se musel komplet přepracovat idea typového systému.

Typový systém je jen sada odvozovacích pravidel. Do UT lze forkWorld přidat jednoduše - do jazyka stačí přidat konstantu forkWorld a typový systém rozšířit o pravidlo (axiom), které jí přiřadí typ.

A bude to potom ještě Uniqueness typing? Já v tomto samozřejmě nejsem nějak extra odborník, ale jak jsem to pochopil: když do jazyka s monádama naimplementuješ forkIO, který forkne tu monádu, tak jsi sice použil hrubou sílu, ale monády jsou spokojený. Neporušil jsi žádný jejich axiom. Zatímco když do jazyka s Uniqueness typing naimplementuješ něco jako forkWorld, tak jsi taky dosáhl svého, taky použil hrubou sílu, ale už to nebude Uniqueness typing, protože jsi porušil pravidlo ohledně jediné instance.

Jako ve výsledku vlastně jde jen o to, že když něco nazveš nějak, tak od toho taky něco očekáváš. A když od jazyka, který o sobě tvrdí, že je pure funkcional, a on pak ve skutečnosti není, tak to naštve. Když by se řeklo, že Haskell je "pure funkcional s výhradou", tak by byl třeba čumil spokojenej.