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-lambda
はcase->
型で、それぞれの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)
そりゃそうだ