Подтвердить что ты не робот

Потоки против монад

Существует ли какая-либо разница между потоками (ленивыми списками) и монадами? С концептуальной и математической точек зрения, а не с технической реализации.

Или, существует ли биуническое, взаимно однозначное соответствие между?

Точнее, в качестве потоков это означает "даже потоки" из SRFI-41 языка Схемы.

Это другая категория, чем монады? Если да, то в какой категории?

Могут ли даже "потоки" гарантировать контроль над побочными эффектами, например, монады?

4b9b3361

Ответ 1

Как уже сказал Салил, эти две концепции разные:

A поток представляет собой (потенциально бесконечный) список значений, как правило, но необязательно, вычисляемый ленивым способом, то есть только хранение некоторого способа вычисления значений по запросу. Там много примеров, которые не связаны с монадами:

(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers))

Полезно также рассматривать конечные, предварительно вычисленные, списки как потоки, так как вы можете использовать их в любом месте (потенциально или обязательно) конечный ленивый поток.

Итак, поток - это то, что имеет операцию next: streamType -> (valueType streamType), чтобы получить следующее значение и оставшийся поток.

 

Монады,, с другой стороны, меньше структуры данных и более способ записи исходного кода путем объединения отдельных команд.

Вероятно, самым простым полезным примером является "Возможно, монада" - я не уверен, что это будет выглядеть на Схеме, извините, но идея такова: учитывая список вычислений (f g h) и ввод x, выполните вычисления по порядку, почти так, как если бы они были заданы (f (g (h x))), но пусть каждая функция будет изящно изнашиваться: если g возвращает nil, не вызывайте (f nil), а вместо этого возвращайте nil немедленно.

 

Вы можете, конечно, объединить эти два различных полезных способа и вычислить свои значения потока с помощью monads или инкапсулировать использование потоков, таких как потоки ввода-вывода, которые не соответствуют ожиданиям функционального программирования в монаде (чтобы избежать код, сохраняющий ссылку на некоторое предыдущее состояние потока), но они служат совершенно другим целям. Подумайте о слое абстракции (закройте обложку, не смотрите на внутренности): Монада, применяемая к функциям, дает вам функцию. С другой стороны, поток - это не какая-то более высокая функция, а список значений.

Очевидно, что функция, определенная (или возвращенная в зависимости от вашей точки зрения), монада может быть реализацией потока, а также значения, извлеченные из потока, могут быть монадами. Но, как вы можете видеть выше, есть монады, реализующие вещи, совершенно отличные от потоков. Есть ли потоки, которые не реализованы, поскольку монады, вероятно, зависят только от того, что именно вы используете для термина. Должен признаться, я не уверен в том, что если бесконечные потоки должным образом квалифицируются как монады; очевидно, конечно.