Jul 12, 2007 12:51
Допустим у нас есть тип (X a), где X ::= T x y z ... Тут важно, что "a" последнее.
Тогда если "a" хотя бы в одном конструкторе данных стоит слева от стрелки, то этот тип нельзя сделать функтором (instance Functor) так, чтобы соблюдались законы над функторами, нес па?
haskell,
типы
Leave a comment
Comments 17
Reply
data T x y z a = ... | C (a -> x)
instance Functor (T x y z)
В (data T x y z a) как ты видишь "а" последнее
Reply
Reply
Reply
В принципе, мне этот тип как монада и не нужен, просто стало интересно почему так.
Reply
Reply
Пусть 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 :)
Reply
data X a = X ((a -> Int) -> Int)
, то можно, и очень легко. Более того, это монада.
Reply
А как вообще тогда определить? Ты можешь мне объяснить как на ТК ложатся типы? В смысле не просто тип X, а его расшифровка - (a -> Int) -> Int - это что в ТК?
Reply
Дык вот, в декартово замкнутой категории написать такой функтор (в смысле, (a -> X) -> X, где X - какой-то фиксированный объект) - нет проблем. Более того, это опять будет монада.
Reply
Может где то можно почитать про отображение типов Хаскеля на ТК?
Reply
Leave a comment