2017-01-10 5 views

ответ

1

В схеме обещание - это просто значение, которое имеет задачу, которая еще не обязательно выполняется, и если вы никогда не используете значение, оно никогда не будет вычислено. Короче говоря, это способ сделать ленивую оценку в противном случае. Типичным способом является вычисление потоков, а не списков.

С помощью списков вы можете использовать функции более высокого порядка, чтобы иметь список, а затем фильтровать его для интересующих вас значений, а затем преобразовывать эти значения и, возможно, в какой-то момент у вас будет достаточно для получения необходимого вам значения. Это приятно, так как вы можете абстрагировать каждый шаг, чтобы вы могли сделать логику, которая делает только один шаг и составлять шаги для создания всей программы, но в этом случае первый шаг должен быть полностью завершен, прежде чем следующий шаг сможет обработать результат первое, в то время как может случиться так, что если вы ищете первое простое число от 0 до 1000, которое повторяется по всем номерам на каждом шаге, может оказаться не столь эффективным. Здесь происходят потоки.

С потоками код выглядит одинаково, но промежуточный результат выполнен по необходимости. Поток - это пара, где части являются обещаниями, так что код, который в противном случае создавал бы пару, задерживается до тех пор, пока значения не будут использованы. Каждый шаг просто создает достаточное количество данных для следующего шага и, следовательно, должно быть достаточно, чтобы на первом этапе было выполнено итерацию всего 20% элементов для последнего шага, чтобы вычислить конечный результат, 80% -ый остаток никогда не будет обрабатываться ни в одном из шаги. С такой структурой исходный поток также может быть бесконечным, как и все числа от 0, увеличенные на 1.

В использовании потоков используются штрафы. Представьте, что вы создадите алгоритм, который все равно будет посещать все элементы. Тогда потоковая версия алгоритма будет медленнее с момента создания обещаний, а форсирование дает накладные расходы eprogram по сравнению с выполнением вычислений без лени.

Возможно, вас интересует Hal Abelson explaining streams и их за и против.

Есть и другие альтернативы потокам ленивой оценки. Один из них - generators. Здесь вы также можете создавать составные процедуры, которые принимают генератор и генерируют генератор. Итерация будет нужна как потоками.

Другой альтернативой будет transducers. Это также является составным и повторяется как потоки и генераторы, но в отличие от генераторов исходные данные не могут быть бесконечной последовательностью, например, с потоками и генераторами, если базовая структура не поддерживает ее.

Преимущества использования обещаний или любой другой техники в этом ответе не являются специфичными для конкретной схемы. Они верны для всех желающих языков программирования!