Я пытаюсь вызвать take
на выходе flatten
. Проблема в том, что take
требует список a
, а flatten
возвращает список Any
. Есть ли способ конвертировать между ними? Или какой-то другой подход, который я должен использовать? Я не смог найти никаких примеров в Racket Docs.
(: extend (All (a) (-> (Listof a) Integer (Listof a))))
(define (extend l n)
; extend a list to length 'n' by appending it to itself
;
; @l list of any
; @n int
; @return list of any
(take (flatten (make-list n l)) n))
Из интерпретатора вот точные типы для каждой функции для справки.
> take
- : (All (a) (-> (Listof a) Integer (Listof a)))
#<procedure:take>
> flatten
- : (-> Any (Listof Any))
#<procedure:flatten>
Вот сообщение об ошибке для справки.
alg/waterfall.rkt:65:2: Type Checker: Polymorphic function `take' could not be applied to arguments:
Argument 1:
Expected: (Listof a)
Given: (Listof Any)
Argument 2:
Expected: Integer
Given: Integer
Result type: (Listof a)
Expected result: (Listof a)
flatten
действительно трудно указать точный тип, поскольку он сглаживает списки произвольной глубины. Рассмотрите возможность использования здесьappend*
вместо этого; он делает более простую вещь и, следовательно, имеет более приятный тип. - person Alexis King   schedule 20.12.2017