Vladislav
Это не только порезать, но и в рантайме манипулировать где какая реализация используется.
coerce для того чтоб можно было расширять множество эффектов в рантайме
По сути это вариация на тему ReaderT IO
Vladislav
Например, здесь можно в куске кода подменить логгер
Влод
ох, ну хоть чуть чуть угадал
то есть в тестах можно заменять интернет запросы на приготовленные ответы?
Vladislav
Это тоже можно
Aleksei (astynax)
Vladislav
В рантайме можешь решить чем заменять
Aleksei (astynax)
или ты имеешь в виду overrideCap?
Vladislav
Его, да
Aleksei (astynax)
Хмм. Вот это неплохо, да
Vladislav
Вообще эта штука решает проблему когерентности в первую очередь. Если просто словарики таскать, то возможна ситуация, что подменишь логгер, а в других эффектах (бд например) останется старый логгер в замыкании
Vladislav
С этим фреймворком там всегда делается lookup ровно перед использованием (поэтому late bound)
Vladislav
Такой fixed point над ReaderT со словариками
Vladislav
Надо будет это потом еще побенчмаркать и возможно заменить Map на unboxed Vector, тогда даже оверхед будет нормальный.
Vladislav
https://github.com/int-index/caps
melvin
как правильно подружить пулл потоков и древовидно рекурсивные функции?
Влод
типа сделать подобную ей структуру и распихать TVar из stm.
только не знаю насколько ок рекурсивные tvar
Влод
хотя в таком случае потоки могут иметь неактуальные tvar
там вообще подразумевается изменение структуры или ты её просто собираешься фолдить эффективно по потокам?
кана
имея такое
data (a :: * -> *) |> b
class Member (t :: * -> *) r
instance Member t (t |> r)
instance Member t r => Member t (t' |> r)
testReader :: Eff (Reader Int |> Void) Int
testReader = do
x <- ask
y <- ask
pure $ x + y
пишет
• Overlapping instances for Member (Reader Int) (Reader Int |> Void)
arising from a use of ‘ask’
Matching instances:
instance Member t (t |> r)
instance Member t r => Member t (t' |> r)
как это возможно, как они могут оверлапиться вообще?
кана
второй инстанс на Reader Int |> Void невозможен, ведь Reader Int никак не может быть внутри Void, возможен только первый инстанс, откуда оверлапинг
кана
предполагается, что кто-то может сделать Reader Int |> Reader Int |> Void?
кана
думаю, этот тайпкласс вполне реально переписать на семейство
кана
лол, да, на семействах все ок работает
кана
type family t `Elem` ts :: Bool where
_ `Elem` Void = False
t `Elem` (t |> r) = True
t `Elem` (t' |> r) = t `Elem` r
type Member t r = t `Elem` r ~ True
кана
может кто объяснить, в чем разница? Почему на тайпклассах не работает, а на семействах работает?
Полагаю, причина в том же, почему не работает открытый Elem (type family без where), но тоже пока сформулировать четко не могу
A64m
потому что для закрытых семейств оверлап и так разрешен
A64m
где оверлап вроде понятно
Vladislav
В закрытых clauses по очереди перебираются и оверлап ок, в открытых оверлап приводит к конфликту и фейлу.
кана
да, это я понял, но где именно оверлап в первом случае? В возможности Reader Int |> Reader Int |> Void?
A64m
оверлап потому, что в инстанс хэд один и тот же конструктор
A64m
а по первому параметру для любого конструктора инстанс
кана
там не для любого же, в первом и во втором аргументе они должны быть одинаковыми
Vladislav
t и t' тоже одинаковые заматчат
A64m
эта одинаковость контекст же, который для разрешения не используется
Vladislav
Member t (t |> r)
Member t (t' |> r)
Второе строго более общее, чем первое
Vladislav
И оверлаппит
кана
хм, я понял, спасибо
кана
я так понимаю, раньше это решение не вызывало ошибку, потому что подобный код есть в первых версиях ext-effects
Vladislav
Всегда должен был вызывать
A64m
там оверлап разрешен просто
A64m
без включенного оверлапа вообще мало что из такого олегинга работает
кана
а, нашел, да
{-# LANGUAGE OverlappingInstances #-}
Vladislav
Если там класс, а не семья типов, то могли быть OverlappingInstances
Vladislav
С семьями типов никак и никогда такое не работало с открытыми
A64m
ну потому что для классов от оверлапов могут словари перепутаться, а в случае семейств - сегфолт, с чем в хаскеле посильнее борются
Vladislav
всё так
Vladislav
(по крайней мере SPJ об этом с такого угла говорил)
Vitaly
Бедный, бедный Taylor Fausak… https://twitter.com/taylorfausak/status/939937217685966848
кана
в хаскель-комьюнити какая-то санта-барбара
Alexander
> blocked me on both GitHub and Twitter for no apparent reason.
> no apparent reason
Alexander
блочить плохо, но какой там к черту no apparent reason
Alexander
и не говорить, что забанишь и достал и т.п. перед этим
Vitaly
Ты подписался на него, чтобы поддержать, надеюсь?
Vitaly
Вообще, самое удивительное, что у нас до сих пор один Haskell.
Vitaly
Боюсь, это только влияние SPJ.
Alexander
нет, я не собираюсь вписываться в их споры, ни на чьей стороне
Alexander
я подписался, чтобы видеть что пишут и формировать более полное мнение
Vitaly
I am on nobody's side, because nobody is on my side!
Alexander
вот что-то такое
Alexander
мне если честно бомбит со снойманитов
Alexander
у меня такое ощущение, что ни один из разговоров с ними, где их мнение не принималось полностью не заканчивалось хорошо
Alexander
там такой my way or the highway что я даже hvr понимаю (хотя и не одобряю бан на гитхабе, это вообще за гранью добра и зла)
Vitaly
Да, я в общем согласен.
Alexander
даже, ок, я вижу что вы говорите и тут вы правы, мы готовы поменять, воспринимается как "о, вы же видите что мы правы во всем, и теперь делайте как надо"
Alexander
они по очереди создают баги во всех проектах, реддите и прочем до конца
Alexander
причем в твиттерах ещё идёт их пассивно-агрессивный стиль, или как это зовется
Alexander
с одной стороны и не ругают и все выглядит корректно, с другой ужасный blaming
Alexander
и им так можно
Alexander
а если что-то против, то все CoC, вызов SPJ и т.п.
Alexander
выговорился
Vitaly
Спасибо!
Alexander
SPJ жалко :)
Alexander
ладно, а теперь пора спать, а то опять в интернетах все правы, а я читать за ними не успеваю
Vitaly
Я не думаю, что он особенно страдает по этому поводу
Alexander
надеюсь, до него этот ад особо не доходит
Vitaly
Это вы про что? Так-то по ходу много возникало, но всё отваливалось быстро
A64m
про eta
Зигохистоморфный
melvin
почему diffClockTimes дает отрицательное значение пикосекунд?
A64m
поскольку хаскель это, фактически ghc где-то с конца 90-х, то вторым хаскелем можно называть только гхц-форк, а все прочее это так, хаскелеподобные языки, которые иной раз пытаются быть хаскелем