Size: a a a

2020 August 28

AV

Alexander Vershilov in fprog_spb
наверное мне стоило просто промолчать, раз могу ошибаться?
источник

K

Kir in fprog_spb
Alexander Vershilov
Так вот я понимаю частично, есть внутреняя структура:
1. внутри что-нибудь свободное free(r), operational, и т.п., + возможно с codencity / reflection w/o remoerse. Но какие вещи тут что дают, у одних явно лучше ассимптотика, но когда это важно и чем мы платим за более хорошую?
2. есть некий контекст, в котором мы собираем список хэндлеров эффектов, типа Eff [m::* -> *], и интерпретатор Eff, который раздаёт эффект соотвествующим handler-ам. Тут какие есть варианты в пространстве дизайна?
3. Точно бывают ограничения типа local эффектов (local в Reader, или исключения), но их явно умеют обходить. Но как? И чем мы за это платим?
Кстати, не обязательно. Я делал как
newtype Eff fs a = Eff { runEff :: forall m. Monad m => Dispatch fs m -> m a }


где Dispatch fs m это набор f m ~> m, для всех Element f fs
источник

AV

Alexander Vershilov in fprog_spb
Dispatch не выражается как свободное-что-нибудь?
источник

MK

Mikhail Kuzmin in fprog_spb
Алгебраические они потому, что я неграмотный, а называть надо. Но алгебраические эффекты, континуации, генераторы, файберы примерно об одном и том же.
источник

K

Kir in fprog_spb
https://github.com/Heimdell/dual-effects/blob/master/src/Core.hs#L66

data Dispatch fs m where
 (:/\) :: f m ~> m -> Dispatch fs m -> Dispatch (f : fs) m
 Empty :: Dispatch '[] m

Не, это список изоморфизмов натуральных трансформаций. Ещё у меня был вариант, где это был Array Int (Any fs m), для O(1) поиска, но там весь Core.hs состоял из unsafeCoerce.
источник

MK

Mikhail Kuzmin in fprog_spb
И если можно, то давайте по исходным вопросам в посте. А они сугубо прикладные.
источник

MK

Mikhail Kuzmin in fprog_spb
Мне без разницы как оно называется, главное чтобы работало и не очень сложно внутри было сделано.
источник

K

Kir in fprog_spb
Mikhail Kuzmin
Алгебраические они потому, что я неграмотный, а называть надо. Но алгебраические эффекты, континуации, генераторы, файберы примерно об одном и том же.
Файберы-то тут при чём?
Континуации тоже не совсем отсюда. На них можно сделать систему эффектов, но эффекты из них сделать практически невозможно.
Генераторы тоже на эффекты не похожи.
источник

MK

Mikhail Kuzmin in fprog_spb
Evgenii Moiseenko
на ICFP этого года есть статья про компиляцию в лямбда исчисление с помощью CPS какого-то подмножества эффектов,
плюс в том что не нужна поддержка от рантайма, и лукап нужного хендлера можно сделать эффективнее чем в общем случае (не через линейный поиск по стеку)
https://dl.acm.org/doi/pdf/10.1145/3408975
Спасибо, может посмотрю. Выглядит интересным.
источник

K

Kir in fprog_spb
Mikhail Kuzmin
Мне без разницы как оно называется, главное чтобы работало и не очень сложно внутри было сделано.
Ну вот у меня по ссылке. Сделано просто (гораздо проще чем в Polysemy), работает вроде даже резче последнего.
источник

MK

Mikhail Kuzmin in fprog_spb
Kir
Файберы-то тут при чём?
Континуации тоже не совсем отсюда. На них можно сделать систему эффектов, но эффекты из них сделать практически невозможно.
Генераторы тоже на эффекты не похожи.
Файберы сделаны поверх континуаций. Генераторы в js суть stackless one-shot континуация.
источник

K

Kir in fprog_spb
Mikhail Kuzmin
Файберы сделаны поверх континуаций. Генераторы в js суть stackless one-shot континуация.
Которых - call/cc или shift-reset?
источник

MK

Mikhail Kuzmin in fprog_spb
Kir
Которых - call/cc или shift-reset?
Хз) а в чем разница?
источник

MK

Mikhail Kuzmin in fprog_spb
А как еще файберы сделаешь? Все равно нужно моделировать продолжение функции.
источник

AV

Alexander Vershilov in fprog_spb
Не понимаю почему эффекты, продолжения и файберы это об одном и том же 🙁
источник

АГ

Александр Гранин... in fprog_spb
Effect tracking is commercially worthless
источник

K

Kir in fprog_spb
В том, что (call/cc (lambda (exit) ...)) позволяет выходить из всего блока вызовом exit, и если сделать (exit exit), а потом вызвать результат блока, то произойдёт телепортация к его выходу. (shift (lambda (reset) ...)) такого не позволяет, потому что delimited
источник

K

Kir in fprog_spb
Надеюсь, я не перепутал shift с reset
источник

AT

Alexander Tchitchigi... in fprog_spb
Александр Гранин
Effect tracking is commercially worthless
Это если correctness is worthless. 🙂
источник

K

Kir in fprog_spb
Для того, чтобы такие штуки (или аналоги) сделать, нужна поддержка продолжений рантаймом. Насколько мне известно, JS этого не может.
источник