Я не могу понять, почему функция sub1 в pick1 имеет проблему с несоответствием типов, а pick0 — нет.
(define-predicate one? One)
(: pick1 (-> Positive-Integer (Listof Any) Any))
(define pick1
(λ(n lat)
(cond [(one? n) (car lat)]
[else (pick1 (sub1 n)
(cdr lat))])))
Я пробовал этот обходной путь, но я думаю, что это неправильный способ решить эту проблему.
(: pick1-workaround (-> Positive-Integer (Listof Any) Any))
(define pick1-workaround
(λ(n lat)
(cond [(one? n) (car lat)]
[else (pick1-workaround (cast (sub1 n) Positive-Integer)
(cdr lat))])))
pick0 не имеет этой проблемы.
;;(: pick0 (-> Natural (Listof Any) Any))
(define pick0
(λ(n lat)
(cond [(zero? n) (car lat)]
[else (pick0 (sub1 n)
(cdr lat))])))