Как я могу использовать определение/контракт (или что-то подобное) в Typed Racket?

Я пишу функцию, которая принимает только положительные числа, и хочу убедиться, что она правильно используется как внутри модуля, так и в других местах.

я хотел написать

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

но Typed Racket не предоставляет свой собственный define/contract, а vanilla define/contract не понимает аннотации Typed Racket (выдает синтаксическую ошибку).

Могу ли я как-то обойти это? Могу ли я использовать голый contract, чтобы прикрепить контракт к excited-logarithm так, как это сделал бы define/contract?

Более того, есть ли веская причина, по которой я не должен этого делать? Не рекомендуется ли смешивать контракты и типы?

Примечание. Я полагаю, что мне действительно нужна здесь зависимая типизация, но она недоступна в Racket.


person shadowtalker    schedule 29.10.2017    source источник


Ответы (1)


Простой ответ здесь: используйте тип «Неотрицательно-действительный» или один из других подобных типов 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

(Есть также типы уточнения, но здесь они вам не нужны.)

person John Clements    schedule 30.10.2017
comment
Ничего себе, я пропустил это в ссылке, спасибо! Однако вопрос остается для общего случая. - person shadowtalker; 30.10.2017
comment
Это зависит от того, насколько общий ваш общий случай. Вы можете использовать уточняющие типы для захвата некоторых ограничений, подобных этому, и вы, безусловно, можете определить свой собственный простой макрос плоского контракта для выполнения этой проверки; большинство интересных/сложных частей контрактов относятся к типам функций. - person John Clements; 30.10.2017
comment
Что такое типы уточнения? Я искал этот термин в документации Typed Racket и ничего не нашел. - person shadowtalker; 30.10.2017
comment
В общем случае, когда определенного типа не существует, типы пересечения могут быть возможными. - person ben rudgers; 30.10.2017
comment
@ssdecontrol Это экспериментальная функция версии 6.10. Вот URL-адрес документов: docs.racket-lang.org/ts-reference/ - person John Clements; 31.10.2017