Как я могу заставить haxe Lambda.filter работать с типизированным итерабельным? Следующий код отказывается компилироваться из-за плохого типа:Использование Lambda.filter() в типизированных итерационных машинах haxe или эквивалентных функциональных конструкциях
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];
}
}
Я знаю, что has been asked before, но ответ дал альтернативную реализацию, которую я могу найти сам, а чем точный ответ о его использовании. Я нахожу, что Lambda создает базовый компонент для функционального программирования, особенно во время создания ленивых композиций с использованием map/reduce, и я понимаю, что их понимание не заменяет их.
Если конструкции Lambda действительно должны исчезнуть, а список понятий - это действительно способ пойти в Haxe 3, почему модуль лямбда все еще существует и как их можно использовать для достижения лености или неограниченного уровня лучшей композиции?
Изменить: способ сделать это работой, чтобы расширить итерацию в массив, который наверняка не является фактическим решением (зацикливание два раза в ту же последовательность!):
Lambda.filter([for (i in keys.keys()) i], function(k:Int) { return keys.exists(k); });
Привет, мне интересно, что такое нижняя сторона лазилямбды, это выглядит довольно хорошо для меня. Почему функции будут лучше? –
Возможно, это было не «глупо», просто я не думаю, что что-то в сторону коротких лямбдов (даже если позже они всегда были в строю) было бы лучше.Были некоторые улучшения в производительности, но поведение, которое я выбрал, на самом деле не помогло решить проблему подробностей. Конечно, вызовы лямбда были короче, но с использованием фиксированных идентификаторов (например, '$ x') читаемость кода пользователя также уменьшилась, а использование рядом со строковыми интерполяциями стало действительно запутанным. Возьмем это: в настоящее время мне придется писать 'vertices.map ($ xx + ',' + $ xy)' вместо более читаемых 'vertices.map (v => '$ {vx}, {v, y} «)'. –
@MarkKnol, я хотел бы услышать больше мыслей по этому вопросу. Пожалуйста, не стесняйтесь обращаться к нам или просто по электронной почте. –