Зигохистоморфный
вот тут конечно побольше всего https://github.com/purescript-contrib/purescript-profunctor-lenses
Vladislav
Я его вот как увидел, так до сих пор и хочу.
A64m
А мне очень понравился (<- a).
совсем не удивительно
Vladislav
А 'T не заменяет (:: T), потому что в (:: T) может быть любой тип, а не один конструктор.
Vladislav
Besides, я обосновал, почему легковесный — сравниваем с Proxy.
A64m
ну, легковеснее прокси, это не очень высокая планка
Vladislav
А какую планку надо ставить?
A64m
а тики нужны для разрешения неопределенности между типом и конструктором, так что в описании типа у некоторых должны быть тики, а у некоторых нет
Vladislav
Но это потребует полный мёрдж термо-типо-парсера, например распозновать forall на тёрмах, а после forall идут точки, а точки это композиция, ой мда.
A64m
А какую планку надо ставить?
вообще никаких значков
Vladislav
вообще никаких значков
Это тоже требует мёрдж тёрмо-типо-парсера.
Vladislav
В Хаскеле это произойдет, наверное, позже, чем зависимые типы, линейные типы, и искуственный интеллект.
A64m
но зато нормально выглядеть будет
Vladislav
Синтаксис вторичен вообще, меня раздражает, что решили убить полезную семантику (visible term-level dependent quantification) потому что синтаксис не придумали.
Vladislav
Ну я тоже не в восторге от 4 символов, но это легковеснее Proxy в любом случае.
A64m
я бы не сказал, что синтаксис вторичен, легковесный синтаксис это важно для того чтоб фича применимой была
A64m
но как временный костыль можно конечно
A64m
просто про легковесность смешно
Vladislav
*fairly lightweight
Vladislav
а не lightweight
Vladislav
Я это тоже с кривой рожей писал, но надо ж было порекламировать.
Зигохистоморфный
еще один порт на профункторы https://github.com/flunc/optics
Зигохистоморфный
есть еще эта наркомания https://github.com/calmm-js/partial.lenses
Artyom
@qnikst ну так я и знал, кондуиты меня победили
Artyom
хочу вот такую функцию: (forall s. ConduitM i o (ST s) r) -> ConduitM i o m r
Artyom
(это всё потому, что cbor-декодер работает в ST, а остальные либы дают чистый интерфейс)
Alexander
хм.. давай я завтра посмотрю
Alexander
хотя хз когда, тут new year madness
Alexander
=)
Artyom
ну это в принципе не только тебе вопрос, а всему чатику 🙂 дорогой чатик, как слифтить чистый ST-шный кондуит в произвольный кондуит?
Alexander
я вот не до конца уверен, что это без хаков реально
Alexander
без MonadBase m`/`MonadIO m и unsafeStToIO
Alexander
но может я и не прав
Vladislav
Я не думаю, что это возможно. В идеале ты хочешь сделать что-то типа hoist (Identity . runST), но тогда GHC потребует, чтобы forall был внутри: ConduitM i o (forall s. ST s) r а это даже в коде не выражается, потому что импредикативный полиморфизм. Ты можешь попробовать сделать ньютайп для ST: newtype AST a = AST (forall s. ST s a) и использовать ConduitM i o AST r но тогда у тебя не сможет быть двух кондуитов над ST, которые используют одну и ту же переменную. Наверное, это хорошо (?)
Artyom
@int_index btw: это по работе, так что затрекай обязательно, что мол помогал артёмке с кондуитами :troll:
Vladislav
Рассмотрим более простую проблему. Вот ты сможешь запустить каждое отдельное действие из forall s. [ST s a]?
Vladislav
И получить [a]?
Vladislav
Мне кажется, нет, потому что forall s. [ST s a] и [forall s. ST s a] это разные типы.
Зигохистоморфный
а это нельзя sequence? тогда будет ST [a] хотя я могу ошибаться
Artyom
ну тогда надо уметь кондуит тоже вывернуть вот так вот
Vladislav
Это нельзя с sequence
Vladislav
ну тогда надо уметь кондуит тоже вывернуть вот так вот
С чего ты решил, что ты можешь хоть какой-то тип так вывернуть?
Vladislav
forall doesn't float into type constructors
Vladislav
Если у тебя forall a. F a, ты не получишь из этого F (forall a. a) уже никогда.
Vladislav
Будь F простым списком или Conduit
Vladislav
Потому что семантика у этих штук разная: [forall s. ST s a] — список независимых ST действий, каждое из них можем запустить отдельно, между ними нет shared STRef-ов forall s. [ST s a] — список ST-действий с одним и тем же s, между ними могут быть shared STRef-ы
Vladislav
Я могу себе представить конверсию в одну сторону (forall floats out), но не в другую (forall floats in).
Vladislav
Если у тебя forall s. ConduitM i o (ST s) r, то лучшее что ты можешь сделать, это сначала запустить conduit, а потом сделать runST, и получить в итоге r
Vladislav
Если тебе хочется делать runST под Conduit через hoist, то это должен быть ConduitM i o (forall s. ST s) r, который надо энкодить ньютайпом над ST чтобы не было импредикативности.
Зигохистоморфный
такс) пошла жесть тут) я пожалуй откланяюсь)
Artyom
Если тебе хочется делать runST под Conduit через hoist, то это должен быть ConduitM i o (forall s. ST s) r, который надо энкодить ньютайпом над ST чтобы не было импредикативности.
это, видимо, не сработает, потому что я всё-таки хочу уметь два таких кондуита объединять видимо, буду пытаться запустить кондуит внутри кондуита тогда, а потом runST
Vladislav
Почему не ST-ньютайп?
Vladislav
и зачем тебе там вообще ST, возьми IO и IORef
Artyom
cborg сука
Artyom
Почему не ST-ньютайп?
хорошо хорошо уговорил сейчас попробую
Зигохистоморфный
cborg сука
а что если заюзать Control.Monad.Morph и перевести Conduit -> IORef и просто с ним рабоать? а потом обратно когда надо?
Artyom
откуда IORef? там cborg как-то внутри у себя юзает ST, я не могу его попросить складывать всё в одну переменную
Artyom
ну или я не так понял
Vladislav
{-# LANGUAGE RankNTypes #-} module STForall where import Control.Monad.ST newtype AST a = AST { runAST :: forall s. ST s a } instance Functor AST where fmap f (AST st) = AST (fmap f st) instance Applicative AST where pure a = AST (pure a) AST f <*> AST a = AST (f <*> a) instance Monad AST where m >>= f = AST $ do x <- runAST m runAST (f x)
Vladislav
(Убедился, что идея viable)
Vladislav
Но у тебя, естественно, не будет внутри кондуита доступа к STRef, созданным за его пределами.
Зигохистоморфный
кстати ты когда-то говорил про Forall это не подойдет тут?
Vladislav
Нет.
Vladislav
Это не про то.
Зигохистоморфный
я так понял тут нужен квантор существования
Vladislav
Что он даст?
Зигохистоморфный
ну почему тогда нельзя так сделать с Conduit без оберток?
Vladislav
Что нельзя сделать?
Vladislav
Я не понял при чем тут экзистенциальная квантификация, если тут квантор всеобщности, и как поможет Forall, который вообще для констрейнтов.
Vladislav
То есть понятно, что (forall s. ST s a) -> a это на самом деле энкодинг exists s. ST s a -> a, но вот чем это помогает не вижу.
Artyom
ок, ну в общем не работает оно с AST
Artyom
возможно
Vladislav
содержательно
Artyom
пойду впихну туда stToIO и скажу, что так и надо
Vladislav
сдался!
Artyom
https://github.com/well-typed/cborg/issues/156
Artyom
БЕН ГАМАРИ ТАК СКАЗАЛ