kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Typed Racketのお勉強 (10)

5 Occurrence Typing

Occurrence Typingとはあまり聞き慣れない言葉
さらっとぐぐってみましたがそれっぽい言葉は見つかりませんでした
あまり普及してない概念なのかもしれません
Typed Closureってやつでも出てくるようです

無理に訳そうとせず進みます

なになに
述語の結果によって型をより正確に特定できるとな

(: flexible-length (-> (U String (Listof Any)) Integer))
(define (flexible-length str-or-lst)
  (if (string? str-or-lst)
      (string-length str-or-lst)
      (length str-or-lst)))

str-or-lstString(Listof Any)かどちらかの
型であるというUnion型ですが
(string? str-or-lst)#tを返したならば
str-or-lstString
そうでなければ消去法でstr-or-lst(Listof Any)型だと
特定してくれるってことですね

だからこういうString型しか引数に取らない、または(Listof 何か)しか
引数にとれない関数にも渡せるよ、ってことでいいのかな

> string-length
- : (-> String Index)
#<procedure:string-length>
> length
- : (All (a) (-> (Listof a) Index))
#<procedure:length>

Occurrence Typingがない言語だとこういうのはどうなるんだっけ?
そもそも文字列型か何かのリストかどちらかを取る値っていうのも
めずらしい気がする、っていうか設計がおかしいかも、って思うかもだなあ