kb84tkhrのブログ

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

Typed Racketのお勉強 (11)

6 Typed-Untyped Interaction

Typedじゃない普通のRacketの関数からTyped Racketの関数は普通に呼べます
Typed RacketからRacketの関数を呼ぶにはrequire/typedで型を指定してやります

#lang racket

(provide (struct-out pt)
         distance)

(struct pt (x y))

(define (distance p1 p2)
  (sqrt (+ (sqr (- (pt-x p2) (pt-x p1)))
           (sqr (- (pt-y p2) (pt-y p1))))))

ここで定義されたでdistanceをTyped Racketから呼ぶには以下のように書きます
(chap06-01-distance.rktは上のファイル名)

(require/typed "chap06-01-distance.rkt"
               [#:struct pt ([x : Real] [y : Real])]
               [distance (-> pt pt Real)])

実行

> (distance (pt 3 5) (pt 7 0))
- : Real
6.4031242374328485

自分の作ったファイルだけでなく標準ライブラリからも同様にしてrequire/typedできます

Typed RacketからRacketの関数を呼ぶ場合、Contractを用いて型のチェックが
行われるため、場合によってはオーバーヘッドが発生するので注意、だそうです