다음 유형화되지 않은 코드를 형식화 된 라켓으로 변환한다고 가정합니다. 이 함수는 SICP에서 영감을 얻어 순수하게 함수로 데이터 구조를 구성하는 방법을 보여줍니다.다형성 유니온 유형으로 발생하는 입력
(define (make-pair x y)
(lambda (c)
(cond
((= c 1) x)
((= c 2) y)
(error "error in input, should be 1 or 2"))))
(define (first p) (p 1))
(define (second p) (p 2))
바로 입력 라켓으로 변환하기는 make-pair
함수의 반환 값은 (: make-pair (All (A B) (-> A B (-> Number (U A B)))))
것 같다. 그리고이 다음에 first
유형은 (: first (All (A B) (-> (-> Number (U A B)) A)))
이어야합니다. 그러나 함수를 구현하는 동안 (p 1)
을 직접 호출 할 수는 없습니다. first
이 유형 A
만 반환하는지 확인하기 위해 일종의 유형을 입력해야하기 때문입니다. first
의 리턴 유형을 (U A B)
으로 변경하면 발생하지만 입력 유형의 부담은 사용자가 아닌 API에서 발생합니다. 따라서이 시나리오에서는 first
(예 : 변수 유형 A
에 대한 조건자를 사용하는 방법)에서 입력 형식을 사용하여 쌍의 첫 번째 구성 요소 만 안전하게 반환 할 수 있습니다.
UPDATE는 I 위에서 약간 다르며 make-pair
함수 인수로 공급 될 A
및 B
위한 조건을 필요로하는 방법을 시도했다. 아래는 코드입니다
#lang typed/racket
(define-type FuncPair (All (A B) (List (-> Number (U A B)) (-> A Boolean) (-> B Boolean))))
(: make-pair (All (A B) (-> A B (-> A Boolean) (-> B Boolean) (FuncPair A B))))
(define (make-pair x y x-pred y-pred)
(list
(lambda ([c : Number])
(cond
((= c 1) x)
((= c 2) y)
(else (error "Wrong input!"))))
x-pred
y-pred))
(: first (All (A B) (-> (FuncPair A B) Any)))
(define (first p)
(let ([pair-fn (car p)]
[fn-pred (cadr p)])
(let ([f-value (pair-fn 1)])
(if (fn-pred f-value)
f-value
(error "Cannot get first value in pair")))))
그러나,이 질문의 시작 유형이 지정되지 않은 코드에서 오류 expected: A given: (U A B) in: f-value