Autor Zpráva
polom
Profil *
Ahoj
Mohl by mi někdo pomoct s objasněním tohoto termínu z angličtiny? Cetl jsem několik články na to téma ale bohužel buď je to moc složitě vysvětlováno nebo jsou složité ty funkce. Není nějaký článek v češtině? Ale hlavně potřebuju sehnat úplně jednoduché příklady na kterých bych tu problematiku mohl pochopit. Na wikipedia.com něco je, ale tak to je jen teorie stručně. Hlavně nevím jaké klíčová slova v češtině hledat a třeba někdo znáte nějaký lehčí příklad, než to co jsem našel zde:
http://www.dustindiaz.com/javascript-curry/
Ten je totiž nefunkční
Taurus
Profil
Zkus možná haskell, hugs nebo funkcionální programování. Tento hnus jsme tam měli, asi bych to našel ve skriptech. Nevím, jestli vysvětlil, možná okopíroval (možná to má L. Škarvada volně na webu).
polom
Profil *
Tak se mi zdá, že tyto termíny vrací spíše výsledky týkající se programování v jiných jazycích než Javascript
polom
Profil *
Vyhledávač dobře reaguje na dotazy "Function Currying" "JS curry function" a taky "JS partial function application" ale stále nevím jak se to nazývá česky

Možná jsem konečně našel solidní a srozumitelný článek v angličtině:
Odkaz

Kde se mimo jiné píše
"By returning another function rather than the results of the function, the script remembers the value of parameters that were originally passed to it."

Jde o takovou situaci, že někdo napíše funkci
function (a,b){
return function (a,b){a+b}
}

a já si říkal proč to nesečíst rovnou...
function (a,b){
a+b
}

no a ono jim jde o to, že při tom prvním postupu se ukládají hodnoty argumentů funkce.

Ten článek vypadá fakt nadějně!
Witiko
Profil
polom

Aniž bych věděl, že se tomu nějak říká, používám tuto techniku ve své knihovně animací. Funkce animace navrátí funkci, která po zavolání zruší veškeré zbývající timeouty a animaci přeruší. Je to rozhodně jednodušší, než cpát do globálního scope pole všech timeoutů.

function rotate(objectID,time,startDeg,finalDeg,callback) {
  if(typeof objectID != "object") objectID = document.getElementById(objectID);
  if(!objectID) {
      if(typeof callback == "function") callback();
      return function() {}
  }
  var calls = [];
  var ticks = Math.round(time / (1000 / FramesPerSecond));
  var delta = finalDeg - startDeg;
  var diff = delta / ticks;
  for(var index = 0; index <= ticks; index++) {
    (function(index){
        calls.push(window.setTimeout(function(){
            var result = index==ticks?finalDeg:startDeg+diff*index;
            setAngle(objectID, result);
            if(index == ticks && typeof callback == "function") callback();
        },index*(1000 / FramesPerSecond)));
    })(index);
  }
  return function() {
    for(var count = 0; count < calls.length; count++) {
      clearTimeout(calls[count]);
    }
  }
}


Celkově bych ale využití této techniky viděl v javascriptu jako omezené.
Timy
Profil
polom:
http://phoenix.inf.upol.cz/esf/ucebni/pp1a.pdf

Hledej „curry“. Trochu smysluplnější příklad než sčítání čísel pak najdeš tu: http://cs.wikipedia.org/wiki/Scheme#Streamy
polom
Profil *
Witiko:
Aniž bych věděl, že se tomu nějak říká
To já zase nevěděl, že existuje funkce na ukončení. Dokonce jsem nevěděl, že window.setTimeout vrací id procesu... Pokud jsem to pochopil, tak ukládáš do pole calls čísla spuštěných procesů a ty pak jednoduše zavřeš, když voláš tu funkci clearTimeout s argumentem pole s id procesů... To mě teda dost překvapilo. Jinak nechápu ř. číslo 5 ... nač generovat funkci, která nic neprovádí? Jedině snad z důvodu, že bych ji chtěl dočasně podržet v paměti - jenže jde to vůbec bez argumentu?

Timy:
Ta příručka i druhý odkaz je na mě moc složitá, to je asi zase pro programátory v jiných jazycích. Toto se učí na VŠ?
_es
Profil
polom:
Dokonce jsem nevěděl, že window.setTimeout vrací id procesu…
Ako zdroj vedomostí môžeš použiť aj kódy v príspevkoch tejto diskusie. Pomocou JS sa v nich dodatočne vytvárajú odkazy na príslušné dokumentácie.
polom
Profil *
_es:
Nejdříve jsem tápal o čem mluvíš, ale jo, to jsem si už všiml.
Timy
Profil
polom:
Jo, ten kód je ve Scheme a ano, toto se učí na VŠ. Možná by k alespoň základnímu pochopení stačilo přečíst si základy syntaxe na Wiki.
Witiko
Profil
polom

Jde mi o to, že funkce má vždy navracet funkci. Proto i v případě zavolání s objektem který neexistuje dojde k navrácení funkce, prázdné. Jinak ve zbytku máš pravdu. Díky "curryingu" můžu id timeoutů ukládat do privátního pole, aniž bych zaneřaďoval global scope.
polom
Profil *
Witiko:
Jde mi o to, že funkce má vždy navracet funkci.
To slyším poprvé. Myslel jsem, že se to používá jen když chceš udržet hodnoty těch argumentů...

Timy:
Je to už v pohodě, už tomu rozumím. Na té wiki jsem to četl a pochopil, ale po praktické stránkce jsem potřeboval nějaký článek. No asi to budu ještě trénovat a pohledám další ukázky, hlavně v souvislosti s memory leaks (jak se ten termín překládá do češtiny).
polom
Profil *
Tak se zase ozývám. Našel jsem na internetu dva příklady, které jsou prakticky identické (alespoň mě se tak jeví), problém je ale v tom, že v prvním případě tvrdí, že se jedná o currying a v druhém se jedná o partial aplication (částečnou aplikaci), což není jedno a to samé.

Nejdříve, ještě zopáknu co je to currying (moje poznámky):
1. Currying je převod jednoduché funkce o počtu argumentů n na funkce s jedním argumentem.
2.a Je to postup který převádí zápis funkce ve tvaru f(a,b,c) na f(x)(y)(z); (touto větou si nejsem jistý)
2.b Částečně aplikovanou funkci lze využít v případě, že zápis je f(x)(y)(z); nebo f x y z;
3. Jedná se o funkci, která vrací tzv. uzávěru, lambda(z){z(x(y))};
4. Při výpočtu hodnoty dosazujeme zleva doprava. Nejdříve dosadíme z, vrátíme výsledek a pak počítáme x, vrátíme výsledek, dosadíme y, a vrátíme konečný výsledek.

Ok a teď uvedu ty příklady:
Function.prototype.curry = function() {
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function() {
      return fn.apply(this, args.concat(
        Array.prototype.slice.call(arguments)));
    };
};

Zdroj

Příklad druhý (jedná se skutečně o partial jak tvrdí nebo o curryng?)
function out(a, b) { document.write(a + " " + b); }

function partial(func /*, 0..n args */) {
  var args = Array.prototype.slice.call(arguments, 1);
  return function() {
  var allArguments = args.concat(Array.prototype.slice.call(arguments));
    return func.apply(this, allArguments);
  };
}


Jason Bunting

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0