Misha
и надо имплементировать немного разные вещи в зависимости от ErrorCaching
Misha
то есть это можно переделать на data family наверное
Vladislav
Теперь второй пункт, про статический выбор f1 или f2. Делать это в compile-time гарантированно невозможно, но если сделать класс, то со включенными оптимизациями скорее всего сработает инлайнинг/специализация. При условии, что f не рекурсивная
Misha
круто
Misha
а почему невозможно?
Vladislav
Потому что создав функцию с типом X x -> R x ты даешь возможность вызывающему определить x в рантайме.
Vladislav
А если твое рассуждение полагается на то, что никто этого делать просто не станет, то это уже оптимизация, а на них полагаться 100% нельзя.
Misha
опа, а вот это интересно
Misha
класс я конечно могу сделать, но сейчас в коде (для динамической реализации) есть вещи типа case errorCaching of NoErrorCaching -> blabla TimedCaching _ -> blabla2 и они раскиданы в разных местах, так что делать из этого класс ну как-то совсем стремно
Misha
но либо так либо GADT, получается
Vladislav
Ну если ты делаешь case errorCaching of, то это все равно рантайм-диспатчеризация
Misha
да, и вот я от нее хочу избавиться, потому что реально динамики там не будет никогда
Misha
это compile-type параметр по сути
Vladislav
Если это полностью статический параметр и ты не делаешь по нему индукции, то тогда похоже на юзкейс для Backpack
Misha
охЪ
Misha
тогда уж GADT
Misha
Потому что создав функцию с типом X x -> R x ты даешь возможность вызывающему определить x в рантайме.
спасибо, у меня только вопрос остался, как так x может определяться в рантайме?
Vladislav
Если экзистенциальную переменную распаковать. data SomeSX = forall x. SomeSX (SX x) main = do s <- getLine SomeSX (_ :: SX x) <- return $ if s == "hello" then SomeSX SX_A else SomeSX SX_B -- here 'x' is a type variable that -- was determined at runtime -- by whether the user has -- entered "hello" or something else
Misha
а! действительно
Misha
круто
Alexander
как выше если множество открыто, если закрыто, то можно и как ты написал
Alexander
data Request a where R1 :: x1 -> Request x1 R2 :: x2 -> Request x2 foo :: Request x -> x foo (R1 y) = ... foo (R2 y) = ...
Alexander
если добавить к foo INLINE, или даже Rules то с ненулевым шансом будет статически разрулено, но гарантий нет
Alexander
https://mobile.twitter.com/InputOutputHK/status/900275171793272834 s/provably/probably/ (trollface.jpg)
Alexander
я не читал, не знаю, ребята из Serokel говорят, что да
Cheese
если бы было доказано, написали бы "proved"
Cheese
а "provable" — это "в теории можно доказать, но мы не смогли"
Cheese
шучу. как я понял аннотацию, они доказали, что если построить протокол указанным способом, то можно будет доказать его устойчивость к некоторым видам атак
Alexander
да
Alexander
я тоже так понял
Alex
Check out @cyberglot's Tweet: https://twitter.com/cyberglot/status/900418418167492612?s=09
Alexander
ну так не в фокусе
Alexander
на самом деле картинка не совсем верная, более верная картинка должна быть на грани обвинения в педофилии, так она будет лучше отражать состояние вещей
Donat
то есть idris это на грани педофилии?
Alexander
ну язык пока слишком мелкий, может вырастет когда-нибудь
Alexander
ну не ребёнок конечно уже, но все ещё не хм.. как это сказать, в общем вы поняли
Donat
ах, теперь ясно о чём
Evgeny
не в возрасте согласия, штоле?
Evgeny
:)
Donat
"There is a function which directly answers the initial question, namely, unsafePerformIO . It is however not intended for conveniently getting rid of the IO constructor. It must only be used to wrap IO functions that behave like non-IO functions" что может быть IO like non-IO?
Alexander
генерация top-level мутабельной переменной
Alexander
чтение из окружения
Vladislav
Ой мда
Vladislav
Как раз это весьма questionable практики.
Alexander
я не говорю, что так делать хорошо
Alexander
но это единственный способ сделать так, если оно нужно
Alexander
а бывает нужно
Alexander
+ чтение из памяти, если доказано, data dependency достаточно
Vladislav
> behave like non-IO functions Вопрос был так проставлен. Самый простой пример -- какие-нибудь вызовы FFI-методов в библиотеках. Еще классический пример -- мемоизацию добавить через мутабельную структуру.
Vladislav
Или использование рандомности в детерменированных алгоритмах (случайный выбор pivot для quicksort, например)
Alexander
да, это примеры получше
Alexander
впрочем для FFI unsafePerformIO не нужно, можно сразу чистую привязку генерировать
Alexander
если мне память не изменяет
Donat
обожаю этот чат :3
Alexander
впрочем unsafePerformIO делает гораздо больше, чем стирает IO
Alexander
она ещё локи делает чтобы действие было выполнено не более 1 раза
Alexander
есть unsafeDupablePerformIO без локов, достаточно безопасное, но действие может более одного раза выполнится, если 2 трада решили использовать значение примерно одновременно
Alexander
а можно просто взять с паттерн-матчнуть по IO, (или inlineIO) но это очень опасная штука
Alexander
там нету data-dependency и учитывая float-out могут получаться смешные вещи
Alexander
типа алиасинг все singleton bytestrings
Alexander
как было когда-то
Cheese
а напомните, в какой-то библиотеке был смешной синоним для unsafeInterleaveIO
Cheese
что-то на тему "адскиОпасноеIO"
Alexander
bytestring
Alexander
собственно то, что я описал это оно и есть
Cheese
да, accursedUnutterablePerformIO
Cheese
http://hackage.haskell.org/package/bytestring-0.10.8.2/docs/src/Data.ByteString.Internal.html#line-564
Cheese
лавкрафтовщина
Зигохистоморфный
@qnikst Привет. А запись твоего и остальных докладов будет?)
Alexander
маловероятно, нужно организатором спрашивать
Зигохистоморфный
ну тогда хоть потом слайдами поделишься?)
Alexander
да
Alexander
надо бы их сделать
Alexander
до конца
Alexander
от начала