memq для списков и потоков

#functional-programming #scheme #racket

Вопрос:

Не мог бы кто-нибудь сказать мне, какие потенциальные проблемы мы могли бы получить, изменив эти две первые функции, предназначенные для удаления дубликатов из списка, на последние две, предназначенные для потоков

 (define (memq item x)  (cond ((null? x ) #f)  ((eq? item (car x )) x)  (else (mem item (cdr x)))))   (define (r lst)  (cond ((null? lst) '())  ((not (memq (car lst ) (scdr lst)))  (cons(car lst) (r (cdr lst))))  (else (r ( cdr last)))))  

В разделе у нас есть потоковая версия, все,что я сделал здесь, как вы можете видеть, — это изменил автомобиль, минусы и cdr на потоковые версии. Я читал, что у этого будут потенциальные проблемы, но я не понимаю, почему.

 (define (memq item x)  (cond ((null? x ) #f)  ((eq? item (stream-car x )) x)  (else (memq item (stream-cdr x)))))   (define (r lst)  (cond ((null? lst) '())  ((not (memq (stream-car lst ) (stream-cdr lst)))  (cons-stream (stream-car lst) (r (stream-cdr lst))))  (else (r ( stream-cdr lst)))))  

Комментарии:

1. Где ты это прочитал? Знание этого, безусловно, помогло бы сделать ответы более актуальными по теме.

2. @amalloy Я прочитал это со слайда PowerPoint из моего университета, в нем не говорится ничего, кроме того, что я написал здесь

Ответ №1:

Большая часть смысла потоков заключается в том, что они потенциально могут быть бесконечными, потому что они генерируются по мере необходимости. Когда потоковая версия вашей r функции вызывается в любом бесконечном потоке, она никогда не выдаст ни одного значения. Вы можете понять, почему это так?

Комментарии:

1. Может быть, потому, что мы не можем проверить бесконечные элементы?

2. Действительно, но некоторые другие виды операций вполне разумно могут выполняться над потоками. Вы можете map бесконечный поток, увеличивая каждый из его элементов на единицу, например. Вы получаете еще один бесконечный поток, который вы можете потреблять по одному элементу за раз столько, сколько захотите. В чем разница между map тобой и твоим r ?

3. хм, значит, мы можем контролировать поток карты, в то время как r будет просто продолжаться до конца потока?

4. Ключ в том, что map это «продуктивно»: он может производить элемент после некоторого конечного объема работы. Ваша функция-нет. Он может легко решить не создавать элемент, но он никогда не сможет закончить чтение бесконечного потока, чтобы сделать вывод об отсутствии дубликатов.