Async + Immutable rubrika: Programování: Jiné
Prosím, neřešte výraziva (callback nebo async, to je buřt) a doufám, že mi prominete (psuedo)haskellovskou syntax.
Mějme funkci sum, která bere parametr pole, a sečte prvky toho pole. Výsledek vyhazuje callbackem.
sum xs \x => print x
Předpokládejme, že prvky toho pole mají být funkce, vracející hodnoty v callbacku - asynchronně.
Takže něco jako:
xs = [ plus 1 2, plus 3 4, plus 5 6 ]
(funkce plus
má tři argumenty, kde poslední je ten callback.)
Cíl je, naimplementovat funkci sum
tak, aby byla i implementace immutable. (Žádné zvenčí huj, uvnitř fuj.) Také je důležité zachovat, aby se ty tři funkce plus
opravdu volali asynchronně (tedy nepovažuji za řešení vnořit to do sebe a volat je postupně).
Funkci print
neřešte.
Myslíte, že to jde? Napsali byste jak (zhruba)? Zajímala by mě i případná podpora jazyků, které to například umí by default (a splňují všechny ty podmínky).
Jak už bylo řečeno, v callbacku můžu udělat jedině vedlejší efekt, takže si nemyslím, že to nějak půjde. Leda s nějakým frameworkem, který mě od toho vedlejšího efektu odstíní, takže s přísliby by to mohlo vypadat takto (Funkce plus a sum budou vytvářet vždy nové přísliby, takže by to mělo také fungovat paralelně.):
var Promise = require('bluebird'); var plus = function(a, b) { console.log("I am trying to compute " + a + " + " + b); return new Promise(function(resolve) { setTimeout(function() { var result = a + b; console.log("Got it! It's " + result); resolve(result); }, Math.random() * 1000); }); }; var sum = function(xs) { return Promise.reduce(xs, function(prev, cur) { return cur + prev; }, 0); } sum([plus(1, 2), plus(3, 4), plus(5, 6)]).then(function(result) { console.log("sum: " + result); });
Výstup, ať je vidět, že se to volá asynchronně:
I am trying to compute 1 + 2 I am trying to compute 3 + 4 I am trying to compute 5 + 6 Got it! It's 7 Got it! It's 3 Got it! It's 11 sum: 21
Nevidím v tom vnitřním stavu u příslibů problém, když půjdu u jakéhokoliv řešení dostatečně hluboko, tak nějaký vedlejší efekt najdu.
Komentáře
- Taco : Takže odpověď zní, že to nejde? — 28.4.2015
Pro zobrazení všech 4 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře