Определить тип параметра "rest" в вариадической полиморфной процедуре, когда арность заранее не известна в типизированной ракетке - PullRequest
0 голосов
/ 10 января 2019

Допустим, я хочу транспонировать 2 x n "матрицу" (список списков) mat. Идиоматический способ сделать это в ракетке -

(apply map list mat)

Чтобы сделать то же самое в typed / racket, мне нужно немного помочь контролеру типов. Тип map в этом случае

(All (c a b ...) 
  (-> (-> a b ... b c) (Listof a) (Listof b) ... b (Listof c)))

Поскольку я имею дело с матрицей 2 x n, я должен создать экземпляры a и b как Number:

(apply (inst map (Listof Number) Number Number) 
       (inst list Number)
       mat)

Если mat была матрица 3 x n,

(apply (inst map (Listof Number) Number Number Number)
       (inst list Number)
       mat)

Сделал бы трюк. Теперь предположим, что я имею в виду матрицу m x n, где m - неизвестное положительное целое число. Есть ли общий способ создания карты, который бы работал для любого значения m?

1 Ответ

0 голосов
/ 10 января 2019

Спасибо, Sorawee Porncharoenwase, это в значительной степени решило мою проблему. Вот что я сделал:

  1. Определите полиморфную zip функцию, как в приведенной ссылке:
(: zip (∀ (a) (-> (Listof a) (Listof a) * (Listof (Listof a)))))
(define (zip lst . lsts)
  (apply map (inst list a) lst lsts))
  1. Примените его к mat:
(apply zip (car mat) (cdr mat))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...