如何为自定义Stream实现stream-filter函数(Racket语言)
自定义Racket Stream的stream-filter实现问题与解决
我正在通过《Schreibe dein Programm!》学习Racket语言,第9章练习要求自行实现Stream操作函数(不可使用内置Stream函数)。在实现stream-filter函数时遇到了两个问题:要么只能过滤流的第一个元素,要么程序直接无法终止。
自定义Stream定义
(define-record stream make-stream stream? (stream-first %a) (stream-rest-function (-> stream)))
stream-filter函数签名
(: stream-filter ((%a -> boolean) stream -> stream))
问题排查与解决
最初的实现只能处理流的第一个元素,当把过滤逻辑放到make-stream的rest分支时,又出现了程序无法终止的情况。后来才明确关键细节:自定义Stream的rest部分是无参函数,调用它需要加两层括号。基于这个点,最终写出了可行的实现(暂未完善空流处理逻辑)。
最终实现代码
(define stream-filter (lambda (condition str) (if (condition (stream-first str)) (make-stream (stream-first str) (lambda () (stream-filter condition ((stream-rest-function str))))) (stream-filter condition ((stream-rest-function str))))))
内容的提问来源于stack exchange,提问作者Ardian
相关产品推荐
相关产品推荐

