2017-10-29 22 views
3

양수 만 받아들이는 함수를 작성 중이며, 모듈과 다른 곳에서 올바르게 사용되도록하고 싶습니다. Typed Racket에서 define/contract (또는 이와 동등한)을 어떻게 사용합니까?

나는

#lang typed/racket 
(require racket/contract) 

(: excited-logarithm (-> Number Number)) 
(define/contract (excited-logarithm ([x : Number]) : Number) 
    (-> (>=/c 0) number?) 
    (displayln "Hold on to your decimals, we're going in!") 
    (log x)) 

을 쓰고 싶었지만 형식화 된 라켓은 자신의 define/contract을 제공하지 않으며, 바닐라 define/contract은 (는 구문 오류가 발생합니다) 형식화 된 라켓의 주석을 이해하지 못합니다.

어떻게 든이 문제를 해결할 수 있습니까? 을 define/contract의 방법으로 excited-logarithm에 연결할 수 있습니까?

또한 이 아니어야하는 이유가 있습니까? 계약과 유형을 혼합하는 것이 바람직하지 않습니까?

참고 : 실제로 여기에 종속 된 타이핑이 필요하다고 가정하겠습니다.하지만 그건 라켓에서 사용할 수 없습니다.

답변

2

간단한 답변 : "Nonnegative-Real"유형 또는이 아이디어를 포착하는 다른 유사한 TR 유형 중 하나를 사용하십시오.

http://docs.racket-lang.org/ts-reference/type-ref.html?q=Positive-Real#%28form._%28%28lib.typed-racket%2Fbase-env%2Fbase-types..rkt%29..Positive-.Real%29%29

(또한 정제 종류가 있습니다,하지만 당신은 여기에 그들을 필요가 없습니다.)

+0

와우, 내가 참조 이러한 놓친, 감사합니다! 그러나 일반적인 경우에는 문제가 남아 있습니다. – shadowtalker

+0

"일반"케이스가 얼마나 일반적인지에 따라 다릅니다. 정제 유형을 사용하여 이와 같은 몇 가지 제약 조건을 캡처 할 수 있으며이 간단한 수급 계약 매크로를 직접 정의하여이 검사를 수행 할 수 있습니다. 대부분의 흥미롭고 도전적인 계약의 일부는 함수 유형에 대해 발생합니다. –

+1

"상세 검색 유형"이란 무엇입니까? Typed Racket 문서에서 해당 용어를 검색했지만 찾지 못했습니다. – shadowtalker