kb84tkhrのブログ

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

Typed Racketのお勉強 (3)

3 Specifying Types の続き

前回、型を指定しないで定義したidの型を見るのを忘れてました

> (define (id z) z)
> id
- : (-> Any Any)
#<procedure:id>

Any型というのがあるんですね

次はlambdaの修飾

> (lambda ([x : Number]) : Number (+ x 5))
- : (-> Number Number)
#<procedure>
> ((lambda ([x : Number]) : Number (+ x 5)) 3)
- : Number
8

.を使った引数の指定は型名の後に*をつけます

> (lambda ([x : Number] . [y : Number *]) : Number (apply + x y))
- : (-> Number Number * Number)
#<procedure>
> ((lambda ([x : Number] . [y : Number *]) : Number (apply + x y)) 1 2 3)
- : Number
6

case-lambdaも同様
と言われてもcase-lambdaて何
引数の数で場合分けしてくれるlambdaのようです

> (case-lambda [() 0]
               [([x : Number]) x])
- : (case-> (-> Number Number) (-> Zero))
#<procedure>

case-lambdacase->型で、それぞれのcaseを関数型としてとるんですね
そして0はNumber型ではなくZero型なのか

練習も兼ねて

> ((case-lambda [() 0]
              [([x : Number]) x]))
- : Integer [more precisely: Zero]
0

Zero型ね

> ((case-lambda [() 0]
                [([x : Number]) x]) 1)
- : Integer [more precisely: One]
1

え、One型もあるの

> 0
- : Integer [more precisely: Zero]
0
> 1
- : Integer [more precisely: One]
1
> 2
- : Integer [more precisely: Positive-Byte]
2

さすがにTwo型はなかった
0と1だけ特別扱いなんだな

引数の数が合わない場合もやっとこう

> ((case-lambda [() 0]
              [([x : Number]) x]) 1 2)
Type Checker: No function domains matched in function application:
Domains: 
         Number
Arguments: One Positive-Byte
 in: ((case-lambda (() 0) (((x : Number)) x)) 1 2)

そりゃそうだ