kb84tkhrのブログ

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

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