Сопоставление с образцом является очень удобочитаемой альтернативой ручной деструктуризации в предложениях 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
Было бы идеально, если бы мы могли сопоставить шаблон с типом последовательности c, так как это инкапсулирует списки и потоки.