Опять про Monadability
Допустим у нас есть тип (X a), где X ::= T x y z ... Тут важно, что "a" последнее.
Тогда если "a" хотя бы в одном конструкторе данных стоит слева от стрелки, то этот тип нельзя сделать функтором (instance Functor) так, чтобы соблюдались законы над функторами, нес па?
Тогда если "a" хотя бы в одном конструкторе данных стоит слева от стрелки, то этот тип нельзя сделать функтором (instance Functor) так, чтобы соблюдались законы над функторами, нес па?
no subject
no subject
data T x y z a = ... | C (a -> x)
instance Functor (T x y z)
В (data T x y z a) как ты видишь "а" последнее
no subject
no subject
no subject
В принципе, мне этот тип как монада и не нужен, просто стало интересно почему так.
no subject
no subject
Пусть F - функтор (например, список). Тогда "a", о которой я говорил - это объект категории, над которой определён этот функтор.
Теперь рассмотрим закон об identity функторов:
F(ida) = F(a)
По какой то причине, если в F "a" учавствует в контрвариантой позиции (что это, кстати, значит - учавствует?), то этот закон не соблюдается. Почему? Это основной вопрос.
Насчёт контрвариантного функтора никогда не слышал. Это что то вроде cmap :: (b -> a) -> (f a -> f b) ?
Тогда для комонад должно соблюдаться (по аналогии join <-> dup; return <-> eval)
return . f = fmap f . return => eval . cmap f = f . eval
join . fmap join = join . join => cmap dup . dup = dup . dup => cmap dup = dup
Это так, измышления, надо побаловаться.
Ещё надо посмотреть есть ли и такой и такой для типов a->a :)
no subject
idF a = F ida -- такой закон есть, но такой закон есть и для контравариантных функторов. почему вы думаете, что его нет?
приставка «ко» возникает, когда переворачиваются стрелки. функтор, говоря языком программирования хаскель, переводит типы в типы, а функции в функции. кофунктор (то есть контравариантный функтор, так короче) делает то же самое, но стрелки функций направлены в обратную сторону.
если у нас есть индексируемый контейнер, то его можно сделать функтором по типу элементов или кофунктором по типу индексов. аналогично, тип (->) -- функтор по типу результата и кофунктор по типу аргумента.
no subject
Я не говорил, что такого закона нет для контравариантных функторов, я сказал, что нельзя построить "правильный" (ко-)функтор для типа (a->), чтобы этот закон соблюдался. И хотел разобраться почему.
Я забыл, что типы функции - это тоже типы, и, следовательно, являются объектами в рассматриваемой категории. Спасибо за напоминание и следующее из него объяснение :) Ещё не до конца понял (я про аналогию тип=объект и функтор (a->b) -> (f a-> f b)), но додумаю пока сам. Если что спрошу :)
Остальное вроде как понятно.
no subject
no subject
А как вообще тогда определить? Ты можешь мне объяснить как на ТК ложатся типы? В смысле не просто тип X, а его расшифровка - (a -> Int) -> Int - это что в ТК?
Re: Reply to your comment...
Дык вот, в декартово замкнутой категории написать такой функтор (в смысле, (a -> X) -> X, где X - какой-то фиксированный объект) - нет проблем. Более того, это опять будет монада.
Re: Reply to your comment...
Может где то можно почитать про отображение типов Хаскеля на ТК?
Re[2]: Reply to your comment...
Почитать - не знаю, я в своё время задавал аналогичный вопрос в
Re: Re[2]: Reply to your comment...
А как ты разбирался? Вот, например, как ты догадался / где узнал то, что объяснил мне?
Re[4]: Reply to your comment...
Я уже знал ТК на неплохом уровне, когда обнаружил Хаскель. А когда что-то хорошо знаешь, начинаешь видеть аналогии и прямые совпадения. Ну и, плюс, терминология помогает - не зря же монаду монадой назвали, как раз из ТК название и пришло.
Re: Re[4]: Reply to your comment...