@ Диагноз Алексис Кинг правильный, и ее предложение использовать более конкретный тип для входного списка будет хорошим, если вы знаете, что список не пустой. Однако в некоторых случаях невозможно изменить тип списка ввода: иногда список пуст и вам приходится с ним иметь дело.
Когда список пуст, вам нужен пустой набор, так что вы можетеприменить set-union
к пустому набору в дополнение к списку:
(define l (list))
(apply set-union (set) l)
;=> (set)
Это заставит Typed Racket принять объединение, даже если l
имеет исходный тип (Listof (Setof Symbol))
, который может быть пустым:
(: l (Listof (Setof Symbol)))
(define l (list (set 'a) (set 'b)))
(apply set-union (set) l)
;=> (set 'a 'b)
Чтобы убедиться, что тип результата может быть конкретным, а объединение может быть (Setof Symbol)
, вы должны убедиться, что (set)
имеет тип, по крайней мере, специфичный. В этом случае пустой набор может иметь тип (Setof Nothing)
, поэтому вы можете использовать ((inst set Nothing))
.
(: l (Listof (Setof Symbol)))
(define l (list (set 'a) (set 'b)))
(apply set-union ((inst set Nothing)) l)
;- : (Setof Symbol)
;=> (set 'a 'b)