用于列表和流的 memq
Posted
技术标签:
【中文标题】用于列表和流的 memq【英文标题】:memq for lists and streams 【发布时间】:2021-12-19 00:37:35 【问题描述】:谁能告诉我,如果将这两个专门用于从列表中删除重复项的函数更改为最后两个用于流的函数,我们会遇到什么潜在问题
(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)))))
在我们有流版本的情况下,正如您所见,我在这里所做的只是将 car、cons 和 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)))))
【问题讨论】:
你在哪里读到的?知道这一点肯定会有助于使答案更符合主题。 @amalloy 我是从我大学的幻灯片中读到的,它没有比我在这里写的更多的内容 【参考方案1】:流的一个重要部分是它们可能是无限的,因为它们是根据需要生成的。在任何无限流上调用 r
函数的流版本时,它永远不会产生单个值。你知道这是为什么吗?
【讨论】:
可能是因为我们无法检查无限元素? 确实如此,但其他一些操作可以完全合理地在流上执行。例如,您可以map
无限流,将其每个元素增加一个。您会返回另一个无限流,您可以一次使用一个元素,只要您愿意。 map
和你的 r
有什么区别?
hmm,所以我们可以控制地图的流动,而 r 将一直持续到流结束?
关键是map
是“有生产力的”:它可以在有限的工作量之后产生一个元素。你的功能不是。它可以很容易地决定 不 生成一个元素,但它永远无法完成对无限流的读取以得出没有重复的结论。以上是关于用于列表和流的 memq的主要内容,如果未能解决你的问题,请参考以下文章
无法使用播放列表项 API 检索 VideoMetaData,例如视频持续时间和流 url?