Linker Unsafe
220 subscribers
182 photos
24 videos
18 files
859 links
Собираю ржавые и лямбдообразные новости, прикольные цитатки с форумов, ссылки на статьи и всё такое. В-общем, сюда я тащу такие крупицы, которые мне будет жаль потерять в цифровой бездне. Возможно, они покажутся интересными и вам.

Фи сюда: @nlinker
Download Telegram
Зигохистоморфный Препроморфизм:
чтобы при моделировании через фри монады избавится от T -> a нужно энкодить через Free + Coyoneda

λeonid Onokhov:
через GADTs не расширяемо выходит. на каждый тип добавлять конструктор

Зигохистоморфный Препроморфизм:
https://github.com/sacundim/free-operational/blob/master/Control/Monad/Operational/Simple.hs#L24

https://github.com/sacundim/free-operational#example-applicative-version-of-reader

немного описания такого поведения
https://jstimpfle.de/blah/free-monads-gadts.html

ответ Кметта
https://stackoverflow.com/questions/14263363/is-operational-really-isomorphic-to-a-free-monad#comment19859454_14263363
Forwarded from Oleg Andreev
Тут интересная история: самый быстрый и аккуратный стек ZKP криптографии написан на Расте: https://medium.com/interstellar/bulletproofs-pre-release-fcb1feb36d4b

Но не потому что компилятор такой быстрый, а потому что язык позволяет всю логику очень аккуратно организовать, от арифметики кривой, до высокоуровневых протоколов. На плюсах никто из тех, кто понимает тему, не осилил бы это. А криптография, которую пишут на си/с++ - это обычно тихий пиздец.
Forwarded from Mikail Bagishov
А зачем ему брать разность указателей? Ты уверен, что этот кейс не покрывается уже имеющимися решениями? Например, чтобы узнать расположение поля в структуре, есть крейт memoffset.
Проблема в том, что в текущих типах эта проблема вообще не решается. Коротко от лодочника: https://twitter.com/withoutboats/status/1027702531361857536?s=21

Так что есть мнение что чтобы это так работало нужно было прям вообще сильно иначе всё делать. Ну или жить с "почти" монадами, как впрочем и хаскель живет с "почти" категорией Hask.
И Ivan:
А подскажите, можно ли сделать композицию функции с 2-мя параметрами?
Тоесть
f(g(x), h(y))?

Alexander Vershilov:
compose f g h = \x y -> f (g x) (h y)

((flip . ((.) .)) .) . (.) - для любителей pointfree

Sergey:
Читаемо, поддерживаемо, расширяемо )

Alexander Vershilov:
c f g h = curry (uncurry f . first g . second h)

так человечнее
Alexander Vershilov:
Как наиболее дешево getClosureSize сделать в живой программе

ghc-heap-view в собранную пргограмму же докинуть можно?

хм, там же был размер, чот не вижу 😕

ghc-datasize

TIL если не указывать custom-setup, то подставляется зависимость Cabal <1.25

optional-packages - прекрасно, добавил зависимость пропатчил попробовал - выкинул

ghc-datasize показывает ерудну, что делать?

О! Не ерунду

177696 -> 98304 за счет компактов

почти в 2 раза ужать структурку и ещё и сделать удобной для GC

в общем я крайне доволен компактами

самый большой набор ip приводит к токену в 1kb, не очень круто

Denis Redozubov:
ты GC оптимизируешь?

Alexander Vershilov:
Ну так нужно кеш добавить, который заведомо не просадит поведение

А то нагрузка и так хорошая, а ещё и ддосят периодически

HashMap + Generic Vector которые мне в кеше нужны не очень клёвые для GC

А собрать всё в компакт оказалось делом пары строк

Roman:
а выложи эти пару строк посмотреть, пожалуйста

Alexander Vershilov:
+- имена индентификаторов:

ref <- newIORef =<< compact HM.empty
let hdl = Handle $ \cid key -> runExceptT $ do
storage <- liftIO $ fmap getCompact $ readIORef ref
c_storage <- HM.lookup cid storage !!? NoRestriction
V.toList <$> HM.lookup key c_storage !!? Missing
pure (hdl, compact >=> writeIORef ref)

строки о компактах в общем-то только compact и getCompact

Отдает функцию для обновления стоража в фоне и функцию поиска в текущем состоянии
Mike Lubinets:
Но если надо динамически, то тут только боксить, конечно.

Dima:
https://github.com/rust-lang/rust/blob/5205ae8bdc2991eecf3bfbb58ed8f56c0673e738/src/librustc/ty/mod.rs#L603-L706 вот че-то такое в итоге запилил

Mike Lubinets:
Хакерство)
Forwarded from Nikita Vilunov
ты не можешь в расте создать тип, который можно дропнуть только передав какое-то дополнительное значение
Nikita Vilunov:
например тебе нужно закрыть сессию с сервером с каким-то результатом. в линейной системе типов ты бы создал сесионный тип и функцию close(Session, &Msg)

вот тебе пожалуйста юзкейз

Анто Шка:
Ты лучше про BufWriter расскажи и про то, как он в дропе проёбывает ошибки от .flush()

Nikita Vilunov:
вообще интересно зачем ты веришь в то, что у раста линейные типы, у тебя от этого погода солнечнее?

Анто Шка:
А что там рассказывать? BufWriter в дропе дёргает .flush(), чтобы все данные из буфера записались. .flush(), разумеется, может возвращать ошибку. Но если она происходит в дропе, то ты про неё не узнаешь, вообще
Как тут не вспомнить знаменитые слова

Новые научные идеи побеждают не потому, что их противники признают свою неправоту, просто противники эти постепенно вымирают, а подрастающее поколение, не обремененное предрассудками, усваивает новые идеи сразу. (Макс Планк)
Forwarded from Nik Bond
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
structopt = { version = "0.2.18", features = [ "paw" ] }
failure = "0.1.5"

Да
Forwarded from Kirill Kuzminykh
@vlad20012 Подскажи пожалуйста - у CLion вышло обновиление 2019.3, и в окне с предложением обновиться указано, что плагин Rust не совместим с новым CLion. Это правда и лучше пока не обновлять CLion?