Racketのストリームとのパターンマッチング?

マインドシーフ

パターンマッチングは、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

ストリームだけでなくリストもカプセル化するため、一般的なシーケンスタイプでパターンマッチができれば理想的です。

Alex Knauth

、述語、およびアクセサーを使用してdefine-match-expanderストリームの独自のパターンマッチングフォームを定義できます?app

#lang racket
(require syntax/parse/define (prefix-in * racket/stream))
(define (stream-empty? v) (and (stream? v) (*stream-empty? v)))
(define (stream-cons? v) (and (stream? v) (not (*stream-empty? v))))

(define-match-expander stream-cons
  (syntax-parser
    [(_ fst rst) #'(? stream-cons? (app stream-first fst) (app stream-rest rst))])
  (syntax-parser
    [(_ fst rst) #'(*stream-cons fst rst)]))

(define-match-expander stream*
  (syntax-parser
    [(_ rst) #'rst]
    [(_ fst more ... rst) #'(stream-cons fst (stream* more ... rst))])
  (syntax-parser
    [(_ init ... rst) #'(*stream* init ... rst)]))

(define-match-expander stream
  (syntax-parser
    [(_) #'(? stream-empty?)]
    [(_ elem ...) #'(stream* elem ... (? stream-empty?))])
  (syntax-parser
    [(_ elem ...) #'(*stream elem ...)]))

それを使用する:

> (define (add-between seq sep)
    (match seq
      [(stream) (stream)]
      [(stream-cons v vs)
       (stream-cons v
                    (stream-cons sep
                                 (add-between vs sep)))]))
> (add-between (stream 'a 'b 'c) 'and)
#<stream>
> (stream->list (add-between (stream 'a 'b 'c) 'and))
'(a and b and c and)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

リストADTのパターンマッチングカスタム実装

分類Dev

Pythonでのリストのパターンマッチング

分類Dev

SMLのリストのパターンマッチング

分類Dev

カスタム データのフォーマットとパターン マッチング

分類Dev

Racketでのパターンマッチング

分類Dev

Racketでのパターンマッチング

分類Dev

Bashスクリプトのパターンマッチング

分類Dev

Haskell:カスタムデータ型とのパターンマッチング

分類Dev

グレムリンでのパターンマッチング

分類Dev

haskellのリストのリストでのパターンマッチング

分類Dev

空のリストのリストのパターンマッチング

分類Dev

文字列のリストからパリンドロームパターンマッチング

分類Dev

リスト内のグループのパターンマッチング

分類Dev

プロローグ:リスト内のパターンマッチング

分類Dev

パターンマッチングと無限リスト

分類Dev

リスト内包表記とパターンマッチング

分類Dev

タプルのオプションリストとのF#パターンマッチング

分類Dev

キーワードリストのパターンマッチング

分類Dev

リストの最後の要素でのパターンマッチング

分類Dev

スクリプトの最初の入力パターンのマッチング

分類Dev

リスト要素とパンダ列のキーワードマッチング

分類Dev

Scalaリストの頭と尾のタイプをパターンマッチングする方法は?

分類Dev

haskellの無限リストの[x、_]構文と(x:_)のパターンマッチング

分類Dev

Elixir / Erlangのものと同様のHaskellのバイナリとビットストリングのパターンマッチング/脱構築

分類Dev

Elixir / Erlangのものと同様のHaskellのバイナリとビットストリングのパターンマッチング/脱構築

分類Dev

バリアントとのOCamlパターンマッチングで「パターンが期待される」

分類Dev

OCamlのバリアントタグのパターンマッチング

分類Dev

パターンマッチングData.Sequenceのようなリスト

分類Dev

カスタムコンストラクターHaskellでのパターンマッチング

Related 関連記事

  1. 1

    リストADTのパターンマッチングカスタム実装

  2. 2

    Pythonでのリストのパターンマッチング

  3. 3

    SMLのリストのパターンマッチング

  4. 4

    カスタム データのフォーマットとパターン マッチング

  5. 5

    Racketでのパターンマッチング

  6. 6

    Racketでのパターンマッチング

  7. 7

    Bashスクリプトのパターンマッチング

  8. 8

    Haskell:カスタムデータ型とのパターンマッチング

  9. 9

    グレムリンでのパターンマッチング

  10. 10

    haskellのリストのリストでのパターンマッチング

  11. 11

    空のリストのリストのパターンマッチング

  12. 12

    文字列のリストからパリンドロームパターンマッチング

  13. 13

    リスト内のグループのパターンマッチング

  14. 14

    プロローグ:リスト内のパターンマッチング

  15. 15

    パターンマッチングと無限リスト

  16. 16

    リスト内包表記とパターンマッチング

  17. 17

    タプルのオプションリストとのF#パターンマッチング

  18. 18

    キーワードリストのパターンマッチング

  19. 19

    リストの最後の要素でのパターンマッチング

  20. 20

    スクリプトの最初の入力パターンのマッチング

  21. 21

    リスト要素とパンダ列のキーワードマッチング

  22. 22

    Scalaリストの頭と尾のタイプをパターンマッチングする方法は?

  23. 23

    haskellの無限リストの[x、_]構文と(x:_)のパターンマッチング

  24. 24

    Elixir / Erlangのものと同様のHaskellのバイナリとビットストリングのパターンマッチング/脱構築

  25. 25

    Elixir / Erlangのものと同様のHaskellのバイナリとビットストリングのパターンマッチング/脱構築

  26. 26

    バリアントとのOCamlパターンマッチングで「パターンが期待される」

  27. 27

    OCamlのバリアントタグのパターンマッチング

  28. 28

    パターンマッチングData.Sequenceのようなリスト

  29. 29

    カスタムコンストラクターHaskellでのパターンマッチング

ホットタグ

アーカイブ