Я пытаюсь создать списки структур с применением в Typed Racket, но не могу понять, как заставить его работать. Я предполагаю, что это связано с проблемой полиморфных функций, но я не могу найти обходной путь.
Это работает:
(struct tt ([a : Integer]
[b : Integer]))
(apply tt '(1 2))
Но это не (отредактировано):
(struct tt2 ([a : String]
[b : (Vectorof Any)]))
(apply tt2 (list "A" (vector 1 2 2)))
С ошибкой:
/usr/share/racket/collects/racket/private/kw.rkt:979:25: Type Checker: Bad
arguments to function in `apply':
Domain: String (Vectorof Any)
Arguments: (List String (Vector Integer Integer Integer))
in: (#%app apply tt23 (#%app list (quote "A") (#%app vector (quote 1) (quote 2) (quote 2))))
Есть ли какое-нибудь решение для этого?
(apply tt2 '(1 (1 2 2)))
отлично работает для меня. Это(apply tt2 '(1 '(1 2 2)))
не работает из-за того, как работаетquote
. Я бы порекомендовал вам избегать использованияquote
для списков и вместо этого писать его как(apply tt2 (list 1 (list 1 2 2)))
. - person Alex Knauth   schedule 16.07.2018'(1 '(1 2 2))
совпадает с(list 1 (list 1 2 2))
, см. В чем разница между цитатой и списком?. - person Alex Knauth   schedule 16.07.2018(Vectorof Integer)
нельзя использовать как(Vectorof Any)
, потому что(Vectorof Any)
может быть изменено позже, чтобы включить нецелые числа. Решение состоит в том, чтобы при создании каждого вектора аннотировать его правильный тип. Это означает замену(vector ....)
на(ann (vector ....) (Vectorof Any))
, если вам нужно использовать его как(Vectorof Any)
. - person Alex Knauth   schedule 16.07.2018