@haskellru

Страница 721 из 1551
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

A64m
29.12.2017
22:34:04
А мне очень понравился (<- a).
совсем не удивительно

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
вообще никаких значков
Это тоже требует мёрдж тёрмо-типо-парсера.

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
Если тебе хочется делать runST под Conduit через hoist, то это должен быть ConduitM i o (forall s. ST s) r, который надо энкодить ньютайпом над ST чтобы не было импредикативности.
это, видимо, не сработает, потому что я всё-таки хочу уметь два таких кондуита объединять видимо, буду пытаться запустить кондуит внутри кондуита тогда, а потом runST

Index
30.12.2017
00:25:03
Почему не ST-ньютайп?

и зачем тебе там вообще ST, возьми IO и IORef

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

Почему не ST-ньютайп?
хорошо хорошо уговорил сейчас попробую

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

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
нет, пока просто работа, если повезет

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

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

Страница 721 из 1551