2017-01-02 3 views
3

В 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 являются в настоящее время различные типы?

+2

ли такого рода проверку? Я бы ожидал, что 'L :: s x -> (s: +: t) ('Left x)' – chi

+0

@chi Я думаю, что это ответ, который просит опросчик. –

+5

Короткий ответ: унифицированная версия сохраняет «выбор» отдельно от «переиндексации». Предложенная вещь - это * особое * переиндексирование, которое можно легко кодировать. (Кстати, я думаю, что chi верен, что существует некоторая доброжелательная ошибка, но исправлена ​​индекс вывода вместо входного индекса.) Я попытаюсь написать правильный ответ позже, но мне нужно запустить. – pigworker

ответ

0

@chi Спасибо за указатель. Оказывается, я ошибался - мое предложение не работает, невозможно комбинировать разные входы. Тем не менее, можно использовать Either для выходных видов, что приводит к конструктору @chi предложил:

data (:+:) :: (i ->- o) -> (i ->- u) -> (i ->- Either o u) where 
    L :: s x o -> (s :+: t) x ('Left o) 
    R :: t x u -> (s :+: t) x ('Right u) 

И :+: и :*: типов на слайдах принимают два типа в качестве аргументов, то есть по существу пара аргументов , Я считаю, что мое предложение могло бы работать, если они приняли альтернативу (т.е. Either) аргументов типа, как и в

data (:|:) :: Either (i ->- o) (j ->- o) -> (Either i j ->- o) 
Смежные вопросы