【发布时间】:2020-06-19 12:32:14
【问题描述】:
模式匹配是在 let 子句中手动解构的一种非常易读的替代方法。我想知道是否可以将它用于流,就像我们可以用于列表一样。
作为一个例子,考虑一个简单的add-between 实现来生成一个序列,其中在原始序列的每个元素之间插入一个元素。
(define (add-between lst sep)
(match lst
['() '()]
[(cons v vs)
(cons v
(cons sep
(add-between vs sep)))]))
用法:
(add-between (list 'a 'b 'c) 'and) ; => '(a and b and c and)
如果我们想对任意序列(如流)做同样的事情怎么办?
(define (add-between seq sep)
(match seq
['() '()]
[(cons v vs)
(stream-cons v
(stream-cons sep
(add-between vs sep)))]))
这会产生错误:
(add-between (stream 'a 'b 'c) 'and)
; match: no matching clause for #<stream>
; stdin:1:1
; Context:
; /Applications/Racket v7.5/collects/racket/match/runtime.rkt:24:0 match:error
; /Applications/Racket v7.5/collects/racket/repl.rkt:11:26
如果我们可以对通用序列类型进行模式匹配,那将是理想的,因为这将封装列表和流。
【问题讨论】:
标签: stream pattern-matching racket