«Вывод для функций ключевого слова polymorphi c не поддерживается» - PullRequest
0 голосов
/ 12 июля 2020

Следующий код вызывает заглавную ошибку:

(: f (∀ (a) (-> [#:x a] (U Integer a))))
(define (f #:x [x #f]) (or x 0))

(f #:x 3)

ОК, но (f #:x (cast 3 Integer)) по-прежнему вызывает ту же ошибку. Где находится переменная типа, чье реифицируемое значение пытается вывести, т.е. переменная типа, значение которой мне нужно явно указать?

Примечание: я пробовал преобразовать (cast (f #:x (cast 3 Integer)) Integer), но DrRacket выделяет только внутреннее (f ...) форма по ошибке типа.

1 Ответ

0 голосов
/ 12 июля 2020

Способ исправить это - аннотировать сам f, а не ввод или вывод.

Кроме того, вы не должны использовать cast для этого, используйте ann вместо cast для присвоения типов выражениям. Использование ann выглядит как (ann 3 Integer).

Есть 2 способа аннотировать f: ann или inst будет работать.

ann

С помощью ann вы можете изменить тип f на не- polymorphi c версия своего типа. Исходный тип - (∀ (a) (-> [#:x a] (U Integer a))), поэтому неполиморфная версия c с Integer - (-> [#:x Integer] Integer). Аннотирование f:

(ann f (-> [#:x Integer] Integer))

В контексте, аннотирование f в вызове функции:

((ann f (-> [#:x Integer] Integer)) #:x 3)

inst

Пример с ann длинный, потому что он переписывает специализированную версию типа f. Для специализации типов polymorphi c более короткий путь - это inst:

(inst f Integer)

Это автоматически специализирует тип на (-> [#:x Integer] Integer) для вас, заменяя параметр типа a с Integer. В контексте, аннотирование f в вызове функции:

((inst f Integer) #:x 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...