Vladislav
Но не то чтобы какая-то из них была основной, а другая обратной. Они по отношению друг к другу обратные.
Vladislav
Для любой категории C мы можем говорить о обратной ей категории Op(C), а Op(Op(C)) = C
Vladislav
Поэтому если мы говорим об эндофункторах и определяем их как отображения C -> C, то дуальное понятие кофунктора это Op(C) -> Op(C). Но это по сути та же самая сущность, потому что какую категорию считать обратной, а какую основной, не важно
Vladislav
В случае с контрафункторами, мы имеем C -> Op(C), но это то же самое, что Op(C) -> Op(Op(C)), т.е. Op(C) -> C, по той же причине
Vladislav
в Хаскеле class Functor c1 c2 f where fmap :: c1 a b -> c2 a b и в дефолтном определении берут c1 = (->) и c2 = (->)
Vladislav
разворачиваем все в обратные категории, получаем class Functor c1 c2 f where fmap :: c1 b a -> c2 b a
Vladislav
что абсолютно идентично (до переименования)
Vladislav
поэтому функтор = кофунктор
Vladislav
а вот если мы только c1 или c2 развернем, то получим контрафукнтор
Vladislav
эндофунктор: c1 = c2, контрафунктор: c1 = op(c2)
Vladislav
type Op c a b = c b a type Endofunctor c = Functor c c type Contrafunctor c = Functor c (Op c) если бы можно было частично применять синонимы вроде Op
Viacheslav
кана
type Op c a b = c b a type Endofunctor c = Functor c c type Contrafunctor c = Functor c (Op c) если бы можно было частично применять синонимы вроде Op
ну вот собственно я и имел в виду, что контрфунктор - унарный термин, как и эндофунктор такая формализация (хоть на хаскеле) помогает четче выразить мысль
Антон
@int_index, а контрфункторы в контексте Хаскелля чем могут быть полезны?
Vladislav
https://hackage.haskell.org/package/contravariant
кана
как составная часть профункторов например
кана
которые довольно полезны и до сих пор мозговыносящие для меня не думаю, что смогу повторить написание призм
Vladislav
Ну да, профунктор это бифунктор контравариантный в одном из параметров
Alexey
Подскажите, а есть ли какие-то структуры данных типа листа или мапа по принципу мвара, где результат завернут в io?
Artyom
stm-containers? Chan/TChan?
Artyom
(ну или я не понял вопрос)
Alexey
я сам не настоящий сварщик. хочется конкуретные коллекции, которые неблокируемые и асихронность выражена через io
Artyom
похоже на stm-containers, да
Artyom
stm в io можешь сам перевести
Alexey
а как мне там list сделать?
Alexey
а, ну видимо нужно просто в stm его запихать, да. но это просто стм. немного другой подход
Artyom
а как мне там list сделать?
никак это уже смотри на Chan и так далее если твой юзкейс не ложится на stack/queue, то это либо TVar [a], либо что-то более хитрое
Alexander
т.к. у меня есть пара предположений о том, что ты хочешь, но я не уверен, что хотя бы одно из них верное
Alexander
сноймано пакет кстати был какой-то
Alexander
на тему того, что хочется
Alexey
мне нравится дизайн мвара - неблокируемый, эффект выражен через io. но мвар это всего лишь одно значение. мне хочется более сложных структур данных, например хеш таблица, у которой будет апи как у мвара - все операции которые потенциально требуют синхронизации обернуты в эффект. io подойдет.
Alexey
хочется такой апи для простого и надежного конкурентного программирования
Антон
STM, не?
Alexander
https://hackage.haskell.org/package/hashtables
Alexander
вот мутабельные хэштейблы
Alexander
но stm гораздо лучше для конкурентности в большинстве случаев
Alexander
если синхронизация coarce grained, то MVar (HashTable a b) достаточно
Alexander
если finegrained надо, то да сложнее, но в stm-containers смотреть или самому делать
Artyom
я вот вообще не осиляю понять, что такое "обернуты в эффект" как у любой мутабельной структуры (хоть конкуррентной, хоть нет) операции могут быть *не* обернуты в эффект?
Alexander
не пытайся понять
Alexander
(вообще имеют тип -> m wtf)
Alexey
спасибо, почитаю.
Alexander
finegrained таблиц я не видел, у Ryan Newton вроде были всякие работы по lockfree структурам
Alexander
там может было что
Alexander
обычно хватает coarse grained
Alexander
вроде ж так пишется?
Alexander
в общем когда на всю структуру лок
Alexander
типа MVar T/ TVar T
Alexander
и вперед
Alexey
Это совсем наивная же реалзиация, да? https://hackage.haskell.org/package/hashtables-1.2.2.1/docs/src/Data-HashTable-IO.html#insert давайте просто заврапим все в ИО не глядя.
Alexander
не наивная
Alexander
но там локов нету
Artyom
finegrained таблиц я не видел, у Ryan Newton вроде были всякие работы по lockfree структурам
так а разве stm-containers не fine-grained? я всю жизнь думал, что да
Alexander
емнип
Alexander
там - да
Alexander
но там вроде хэштаблиц не было
Alexander
?
Alexander
я вообще стараюсь держаться подальше от пакетов Никиты, они клевые местами, особенно hasql, но настолько упоротые по апи и реализации бывают
Alexey
да, но вместо того чтобы обезопасить только один бакет мы просто защищаем весь инсерт.
Alexey
ладно, похоже я хочу странного
Artyom
но там вроде хэштаблиц не было
> A hash table, based on an STM-specialized hash array mapped trie.
Alexander
не, не странного
Alexander
вон говорят в stm-containers все есть
Alexey
вот есть в джаве concurrent hashmap. в нем минимум блокировок и синхронизаций. он быстрый и классный. есть мвар, в котором в сигнатуре io. хочется вот такую же :)
Alexey
да, я покопаю стм пакет из хаскелла в деталях
Alexander
stm-containers же!
Alexey
я вообще на скале программирую, но там такого не нашел. только мвар. думал может у вас есть. )
Artyom
stm-containers у нас есть
Alexey
ок. буду читать
Alexander
хотя покопать stm чтобы понять что это такое тоже полезно
Alexander
просто решение задачи в другом пакете
Alexey
что такое стм я знаю. интересно посмотреть конкретную реализацию в хаскелле
Alexey
этот стм это стандартный пакет? или от сообщества?
Alexey
я имею ввиду это дефолтный путь или дефолтного нет?
Alexander
стандартные
Alexey
ок
Alexander
что такое дефолтный путь?
Alexander
если что родина stm это здесь
Alexander
вроде нету ни одного другого языка где есть адекватный stm