Typed Racketのお勉強 (6)
4 Types in Typed Racket (続き)
いくつかの型を取る可能性がある変数や関数はUnion型になります
> (if (even? 37) 'yes 'no)
- : Symbol [more precisely: (U 'yes 'no)]
'no
'yes
や'no
を返す、っていうところまで見てるんですねえ
ってそういうの見ないと型推論とかできないか
こういう型がないとLisp伝統の、見つからなければ#f
を返す、ってのが
できないですもんね
> member
- : (All (a)
(->* (Any (Listof a)) ((-> a a Any)) (U False (Pairof a (Listof a)))))
#<procedure:member>
値の型はFalse
か(Pairof a (Listof a))
となってますね
(Pairof a (Listof a))
っていうのは最低限ひとつの要素を持つリスト、って
意味でしょうか
そういえば関数を指定するところはAny
と指定されてますね
ほかには書きようはないんでしょうか
再帰的な型を定義することもできます
(define-type BinaryTree (U BinaryTreeLeaf BinaryTreeNode))
(define-type BinaryTreeLeaf Number)
(define-type BinaryTreeNode (Pair BinaryTree BinaryTree))
Typed Racketの型は階層化されていて、上位の型が期待されているところには
下位の型を入れることができます
上位の型をSupertype、下位の型をSubtypeと呼びます
- RealはIntegerのSupertype、IntegerはRealのSubtype、といった具合
- すべての型はAnyのSubtype
- もしある関数が別の関数と引数の数が同じで、引数がSupertypeで、値がSubtypeならその関数の型はもうひとつの関数のSubtype