第 4 部分 · 语言设计
类型系统
类型系统
探索 Typed Racket,理解渐进类型系统在 Racket 中的实现。
Typed Racket 基础
#lang typed/racket ;; 类型注解 (: add (-> Integer Integer Integer)) (define (add x y) (+ x y)) ;; 带类型的结构体 (struct: point ([x : Real] [y : Real])) (: distance (-> point point Real)) (define (distance p1 p2) (sqrt (+ (sqr (- (point-x p2) (point-x p1))) (sqr (- (point-y p2) (point-y p1))))))
常用类型
Integer ; 整数 Real ; 实数 String ; 字符串 Boolean ; 布尔值 (Symbol) ; 符号 (Listof A) ; 元素类型为 A 的列表 (U A B) ; 联合类型:A 或 B (Option A) ; (U A #f) (-> A B) ; 从 A 到 B 的函数 (-> A B C) ; 接受 A 和 B,返回 C
多态类型
(: my-map (All (A B) (-> (-> A B) (Listof A) (Listof B)))) (define (my-map f lst) (if (null? lst) '() (cons (f (car lst)) (my-map f (cdr lst)))))
渐进类型
Typed Racket 可以与无类型 Racket 无缝互操作:
;; typed-module.rkt #lang typed/racket (: square (-> Integer Integer)) (define (square x) (* x x)) (provide square) ;; untyped-module.rkt #lang racket (require "typed-module.rkt") (square 5) ; => 25,类型检查在边界自动插入
小结
Typed Racket 的渐进类型系统让你可以在需要类型安全的地方添加类型,同时保持与无类型代码的互操作。