Способ исправить это - аннотировать сам f
, а не ввод или вывод.
Кроме того, вы не должны использовать cast
для этого, используйте ann
вместо cast
для присвоения типов выражениям. Использование ann
выглядит как (ann 3 Integer)
.
Есть 2 способа аннотировать f
: ann
или inst
будет работать.
С помощью 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)
Пример с ann
длинный, потому что он переписывает специализированную версию типа f
. Для специализации типов polymorphi c более короткий путь - это inst
:
(inst f Integer)
Это автоматически специализирует тип на (-> [#:x Integer] Integer)
для вас, заменяя параметр типа a
с Integer
. В контексте, аннотирование f
в вызове функции:
((inst f Integer) #:x 3)