2015-09-08 16 views
6

Raket içindeki bir işlevin giriş için veri türünü zorlamak istiyorum. Örneğin, bu işlevde, tamsayıları beklemek ve birisi bir dize girdiğinde bir hata atmak istiyorum.Raket işlev için giriş türlerini zorlar

Bunu Racket'te zorlamak için standart bir yol var mı?

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

cevap

8

Evet, iki standart yol vardır.

Sözleşmeler

Contracts onay koşullarını ve zamanında hataları yükseltmek:

#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) 

Yazılan Racket

Yoksa derleme zamanında türlerini denetler Typed Racket, kullanabilirsiniz:

#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" 
İlgili konular