2015-09-08 10 views
6

ラケットの関数に入力するデータ型を強制したいと思います。たとえば、この関数では、整数を期待して、誰かが文字列を入力した場合にエラーをスローしたいと考えています。ラケット関数の入力タイプを適用する

これをラケットに適用する標準的な方法はありますか?

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

答えて

8

はい、標準的な方法が2つあります。

契約

Contractsチェック条件と、実行時にエラーを上げる:

#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 Racketを、使用することができます。

#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" 
関連する問題