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-lst
はString
か(Listof Any)
かどちらかの
型であるというUnion型ですが
(string? str-or-lst)
が#t
を返したならば
str-or-lst
はString
型
そうでなければ消去法でstr-or-lst
は(Listof Any)
型だと
特定してくれるってことですね
だからこういうString
型しか引数に取らない、または(Listof 何か)
しか
引数にとれない関数にも渡せるよ、ってことでいいのかな
> string-length
- : (-> String Index)
#<procedure:string-length>
> length
- : (All (a) (-> (Listof a) Index))
#<procedure:length>
Occurrence Typingがない言語だとこういうのはどうなるんだっけ?
そもそも文字列型か何かのリストかどちらかを取る値っていうのも
めずらしい気がする、っていうか設計がおかしいかも、って思うかもだなあ