
Artyom
29.12.2017
22:03:42
+

Denis
29.12.2017
22:04:59
ну как таковых профункторных линз нет в хаскелл? вроде я только в purescript такие видел

Artyom
29.12.2017
22:05:48
что значит “нет”? есть либы, вот например http://hackage.haskell.org/package/mezzolens
afaik эту O'Connor написал как пруф-оф-концепт

Denis
29.12.2017
22:06:11
ну это да

Google

Denis
29.12.2017
22:06:23
только погнила она
не обновляется
вот тут конечно побольше всего https://github.com/purescript-contrib/purescript-profunctor-lenses

Index
29.12.2017
22:33:27
Я его вот как увидел, так до сих пор и хочу.

A64m
29.12.2017
22:34:04

Index
29.12.2017
22:34:07
А 'T не заменяет (:: T), потому что в (:: T) может быть любой тип, а не один конструктор.
Besides, я обосновал, почему легковесный — сравниваем с Proxy.

A64m
29.12.2017
22:35:43
ну, легковеснее прокси, это не очень высокая планка

Index
29.12.2017
22:36:25
А какую планку надо ставить?

A64m
29.12.2017
22:36:52
а тики нужны для разрешения неопределенности между типом и конструктором, так что в описании типа у некоторых должны быть тики, а у некоторых нет

Index
29.12.2017
22:37:35
Но это потребует полный мёрдж термо-типо-парсера, например распозновать forall на тёрмах, а после forall идут точки, а точки это композиция, ой мда.

A64m
29.12.2017
22:37:41

Google

Index
29.12.2017
22:38:04

A64m
29.12.2017
22:38:11

Index
29.12.2017
22:38:21
В Хаскеле это произойдет, наверное, позже, чем зависимые типы, линейные типы, и искуственный интеллект.

A64m
29.12.2017
22:38:24
но зато нормально выглядеть будет

Index
29.12.2017
22:39:11
Синтаксис вторичен вообще, меня раздражает, что решили убить полезную семантику (visible term-level dependent quantification) потому что синтаксис не придумали.
Ну я тоже не в восторге от 4 символов, но это легковеснее Proxy в любом случае.

A64m
29.12.2017
22:40:06
я бы не сказал, что синтаксис вторичен, легковесный синтаксис это важно для того чтоб фича применимой была
но как временный костыль можно конечно
просто про легковесность смешно

Index
29.12.2017
22:40:39
*fairly lightweight
а не lightweight
Я это тоже с кривой рожей писал, но надо ж было порекламировать.

Denis
29.12.2017
22:43:28
еще один порт на профункторы https://github.com/flunc/optics
есть еще эта наркомания https://github.com/calmm-js/partial.lenses

Artyom
29.12.2017
23:58:59
@qnikst ну так я и знал, кондуиты меня победили
хочу вот такую функцию: (forall s. ConduitM i o (ST s) r) -> ConduitM i o m r
(это всё потому, что cbor-декодер работает в ST, а остальные либы дают чистый интерфейс)

Alexander
29.12.2017
23:59:56
хм.. давай я завтра посмотрю
хотя хз когда, тут new year madness
=)

Google

Artyom
30.12.2017
00:00:20
ну это в принципе не только тебе вопрос, а всему чатику ?
дорогой чатик, как слифтить чистый ST-шный кондуит в произвольный кондуит?

Alexander
30.12.2017
00:02:07
я вот не до конца уверен, что это без хаков реально
без MonadBase m`/`MonadIO m и unsafeStToIO
но может я и не прав

Index
30.12.2017
00:13:35
Я не думаю, что это возможно. В идеале ты хочешь сделать что-то типа 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
30.12.2017
00:13:48
@int_index btw: это по работе, так что затрекай обязательно, что мол помогал артёмке с кондуитами :troll:

Index
30.12.2017
00:15:28
Рассмотрим более простую проблему. Вот ты сможешь запустить каждое отдельное действие из forall s. [ST s a]?
И получить [a]?
Мне кажется, нет, потому что forall s. [ST s a] и [forall s. ST s a] это разные типы.

Denis
30.12.2017
00:16:33
а это нельзя sequence? тогда будет ST [a] хотя я могу ошибаться

Artyom
30.12.2017
00:17:06
ну тогда надо уметь кондуит тоже вывернуть вот так вот

Index
30.12.2017
00:17:20
Это нельзя с sequence

Index
30.12.2017
00:18:20
forall doesn't float into type constructors
Если у тебя forall a. F a, ты не получишь из этого F (forall a. a) уже никогда.
Будь F простым списком или Conduit
Потому что семантика у этих штук разная:
[forall s. ST s a] — список независимых ST действий, каждое из них можем запустить отдельно, между ними нет shared STRef-ов
forall s. [ST s a] — список ST-действий с одним и тем же s, между ними могут быть shared STRef-ы
Я могу себе представить конверсию в одну сторону (forall floats out), но не в другую (forall floats in).
Если у тебя forall s. ConduitM i o (ST s) r, то лучшее что ты можешь сделать, это сначала запустить conduit, а потом сделать runST, и получить в итоге r
Если тебе хочется делать runST под Conduit через hoist, то это должен быть ConduitM i o (forall s. ST s) r, который надо энкодить ньютайпом над ST чтобы не было импредикативности.

Google

Denis
30.12.2017
00:23:46
такс) пошла жесть тут) я пожалуй откланяюсь)

Artyom
30.12.2017
00:24:44

Index
30.12.2017
00:25:03
Почему не ST-ньютайп?
и зачем тебе там вообще ST, возьми IO и IORef

Artyom
30.12.2017
00:25:40
cborg сука

Denis
30.12.2017
00:28:13
cborg сука
а что если заюзать Control.Monad.Morph и перевести Conduit -> IORef и просто с ним рабоать? а потом обратно когда надо?

Artyom
30.12.2017
00:28:54
откуда IORef? там cborg как-то внутри у себя юзает ST, я не могу его попросить складывать всё в одну переменную
ну или я не так понял

Admin
ERROR: S client not available

Index
30.12.2017
00:32:14
{-# 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)
(Убедился, что идея viable)
Но у тебя, естественно, не будет внутри кондуита доступа к STRef, созданным за его пределами.

Denis
30.12.2017
00:33:45
кстати ты когда-то говорил про Forall это не подойдет тут?

Index
30.12.2017
00:33:55
Нет.
Это не про то.

Denis
30.12.2017
00:34:24
я так понял тут нужен квантор существования

Index
30.12.2017
00:34:53
Что он даст?

Denis
30.12.2017
00:35:25
ну почему тогда нельзя так сделать с Conduit без оберток?

Index
30.12.2017
00:36:02
Что нельзя сделать?

Google

Index
30.12.2017
00:36:50
Я не понял при чем тут экзистенциальная квантификация, если тут квантор всеобщности, и как поможет Forall, который вообще для констрейнтов.
То есть понятно, что (forall s. ST s a) -> a это на самом деле энкодинг exists s. ST s a -> a, но вот чем это помогает не вижу.

Artyom
30.12.2017
00:47:39
ок, ну в общем не работает оно с AST

Index
30.12.2017
00:47:56

Artyom
30.12.2017
00:49:47
возможно

Index
30.12.2017
00:51:30
содержательно

Artyom
30.12.2017
00:52:45
пойду впихну туда stToIO и скажу, что так и надо

Index
30.12.2017
00:53:12
сдался!

Artyom
30.12.2017
00:53:26
https://github.com/well-typed/cborg/issues/156
БЕН ГАМАРИ ТАК СКАЗАЛ

Index
30.12.2017
00:54:13
Я не понял, ты в итоге в IO хочешь или нет?

Artyom
30.12.2017
00:54:35
конечно не хочу
я чувствую, что можно без IO сделать
но у меня нет другого выхода, видимо

Index
30.12.2017
00:54:37
Брать s ~ RealWorld и делать stToIO это нормально, но ты уже runST не сделаешь.
Ты главное потом назад в ST не конвертируй.

Artyom
30.12.2017
00:59:44
чесслово не буду

Gufran
30.12.2017
04:39:23
S

A64m
30.12.2017
08:32:37
> The really new thing about release 0.06 is this: if you can get your program through the compiler, then it should actually work when you run it!
все еще лучшая фича GHC, хотя пока еще и экспериментальная

Alister
30.12.2017
08:34:26
А корректная работа не обещается?

A64m
30.12.2017
08:35:11
нет, пока просто работа, если повезет

Alexander
30.12.2017
08:44:08

A64m
30.12.2017
08:45:25
это я старые release notes читаю, в новых-то фич нет

Alexander
30.12.2017
09:39:49
а что за фича?