2015-09-08 17 views
6

Tôi muốn thực thi kiểu dữ liệu cho đầu vào cho một hàm trong vợt. Ví dụ, trong hàm này tôi muốn mong đợi các số nguyên và đưa ra một lỗi nếu ai đó nhập vào một chuỗi.Vợt thi hành các kiểu đầu vào cho hàm

Có cách nào tiêu chuẩn để thực thi điều này trong vợt không?

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

Trả lời

8

Có, có hai cách tiêu chuẩn.

Hợp đồng

Contracts điều kiện kiểm tra và nâng cao các lỗi khi chạy:

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

Typed vợt

Hoặc bạn có thể sử dụng Typed Racket, trong đó kiểm tra các loại tại thời gian biên dịch:

#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" 
Các vấn đề liên quan