Racket 编程

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 的渐进类型系统让你可以在需要类型安全的地方添加类型,同时保持与无类型代码的互操作。