В Slicing It Conor McBride разрабатывает индексированные функторы, а затем описывает их суммы и продукты на слайде «Сумма и продукт» (слайды не маркированы, около 90% в презентации). Этот слайд начинаетсяСумма индексированных функторов
-- sum - choose between compatible structures
data (:+:) :: (i ->- o) -> (i ->- o) -> (i ->- o) where
L :: s x :-> (s :+: t) x
R :: t x :-> (s :+: t) x
instance (IFunctor s, IFunctor t) => IFunctor (s :+: t) where
imap f (L sx) = L (imap f sx)
imap f (R tx) = R (imap f tx)
В частности, это определение :+:
требует, чтобы оба индексированных функторов имеют одинаковый индекс источника i
. Интересно, почему это так. Можно ли это смягчить, например? к позволяя
-- sum - choose between compatible structures
data (:+:) :: (i ->- o) -> (j ->- o) -> (Either i j ->- o) where
L :: s x :-> (s :+: t) x
R :: t x :-> (s :+: t) x
где i
и j
являются в настоящее время различные типы?
ли такого рода проверку? Я бы ожидал, что 'L :: s x -> (s: +: t) ('Left x)' – chi
@chi Я думаю, что это ответ, который просит опросчик. –
Короткий ответ: унифицированная версия сохраняет «выбор» отдельно от «переиндексации». Предложенная вещь - это * особое * переиндексирование, которое можно легко кодировать. (Кстати, я думаю, что chi верен, что существует некоторая доброжелательная ошибка, но исправлена индекс вывода вместо входного индекса.) Я попытаюсь написать правильный ответ позже, но мне нужно запустить. – pigworker