Racket为函数强制输入类型

Racket为函数强制输入类型,racket,typed-racket,Racket,Typed Racket,我想强制执行racket中函数输入的数据类型。例如,在这个函数中,如果有人输入字符串,我希望得到整数并抛出一个错误 有没有一个标准的方法来执行这一点在球拍 (sum-coins pennies nickels dimes quarters) pennies : integer? nickels : integer? dimes : integer? quarters : integer? 是的,有两种标准方法 合同 检查条件并在运行时引发错误: #lang racket (d

我想强制执行racket中函数输入的数据类型。例如,在这个函数中,如果有人输入字符串,我希望得到整数并抛出一个错误

有没有一个标准的方法来执行这一点在球拍

(sum-coins pennies nickels dimes quarters)
  pennies : integer?
  nickels : integer?
  dimes : integer?
  quarters : integer?

是的,有两种标准方法

合同 检查条件并在运行时引发错误:

#lang racket

(define/contract (sum-coins pennies nickels dimes quarters)
  (-> integer? integer? integer? integer? integer?)
  (+ (* 1 pennies)
     (* 5 nickels)
     (* 10 dimes)
     (* 25 quarters)))

(sum-coins 1 2 3 4)
;; => 141
(sum-coins "1" 2 3 4)
; sum-coins: contract violation
;   expected: integer?
;   given: "1"
;   in: the 1st argument of
;       (->
;        integer?
;        integer?
;        integer?
;        integer?
;        integer?)
;   contract from: (function sum-coins)
;   blaming: /tmp/so.rkt
;    (assuming the contract is correct)
;   at: /tmp/so.rkt:3.18
; Context (errortrace):
;    /tmp/so.rkt:11:0: (sum-coins "1" 2 3 4)
;    /tmp/so.rkt:11:0: (sum-coins "1" 2 3 4)
打字球拍 也可以使用,在编译时检查类型:

#lang typed/racket

(define (sum-coins [pennies : Integer]
                   [nickels : Integer]
                   [dimes : Integer]
                   [quarters : Integer])
  (+ (* 1 pennies)
     (* 5 nickels)
     (* 10 dimes)
     (* 25 quarters)))

(sum-coins 1 2 3 4)
;; => 141
(sum-coins "1" 2 3 4)
; /tmp/so2.rkt:14:11: Type Checker: type mismatch
;   expected: Integer
;   given: String
;   in: "1"