2015-09-08 9 views
6

Ich möchte den Datentyp für die Eingabe in eine Funktion in Racket erzwingen. Zum Beispiel möchte ich in dieser Funktion ganze Zahlen erwarten und einen Fehler ausgeben, wenn jemand eine Zeichenkette eingibt.Racket erzwingen Eingabearten für Funktion

Gibt es eine Standardmethode, um dies in Racket durchzusetzen?

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

Antwort

8

Ja, es gibt zwei Standardwege.

Verträge

Contracts Bedingungen prüfen und erhöhen Fehler zur Laufzeit:

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

typisierten Racket

Oder Sie können Typed Racket verwenden, die Typen bei der Kompilierung überprüft:

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