Как мога да накарам haxe Lambda.filter да работи с въведен итерируем? Следващият код отказва да се компилира поради лош тип:
Iterator<Int> should be Iterable<Unknown<0>>
{ next : Void -> Int, hasNext : Void -> Bool } should be Iterable<Unknown<0>>
Примерен код:
import Lambda;
import openfl.events.KeyboardEvent;
class KeyBoard {
private var keys:Map<Int,Bool>;
public function new() keys = new Map();
public function key_handler(key:KeyboardEvent) {
if (key.type == KeyboardEvent.KEY_DOWN) keys.set(key.keyCode, true);
if (key.type == KeyboardEvent.KEY_UP) keys.remove(key.keyCode);
}
public function keys_down() {
return Lambda.filter(keys.keys(), function(k:Int) { return keys.exists(k);});
// The comprehension working alternative:
//return [for (k in keys.keys()) if (keys.exists(k)) k];
}
}
Знам, че беше задаван преди, но отговорът даде алтернатива изпълнение, което мога да намеря сам, а не точен отговор за използването му. Намирам, че Lambda конструира основен компонент за функционално програмиране, особено по време на създаване на мързеливи композиции с помощта на map/reduce, и разбирам, че разбирането на списъка не ги замества.
Ако конструкциите Lambda наистина трябва да изчезнат и разбирането на списъци наистина е начинът да отидете в Haxe 3, защо модулът Lambda все още е там и как могат да бъдат използвани за постигане на мързел или неограничени нива на по-добра композиция?
Редактиране: Начин да го накарате да работи е да разширите итерируемия в масив, който със сигурност не е действително решение (циклете два пъти една и съща последователност!):
Lambda.filter([for (i in keys.keys()) i], function(k:Int) { return keys.exists(k); });