Size: a a a

2021 April 03

KV

Kirill Valyavin in Haskell
Ну т. е. у аппликативного вычисления AST известно заранее, у селективного их заранее перечислимое множество, а у монад не перечислимое (ну в теории перечислимое, потому что всё можно закодировать строками байтов, но это такоэ)
источник

K

Kir in Haskell
toriningen
а если вас не затруднит, то вы могли бы привести хотя бы небольшой пример того, как это могло бы происходить? это очень помогло бы построить интуицию насчет того, что это такое и как этим пользоваться
https://hackage.haskell.org/package/free-5.1.6/docs/src/Control.Monad.Free.Ap.html#line-201

  Free m >>= f = Free ((>>= f) <$> m)
- каждый раз, когда вызывается >>= оно обходит всё дерево, заменяя узлы Pure a на f a. Каждый раз, сверху вниз.

Codensity m и его байнд устроен так, что он идёт от листьев, и всё дерево не обходится.

Когда же нужен Free f, то берётся Codensity (Free f) и разгибается через improve. И поскольку дерево было построено не через Free.>>= а через Codensity.>>= оно работает быстрее.
источник

KV

Kirill Valyavin in Haskell
Надо короче придумать ещё более индустриальные фримонады, где бинд не функция, а мапа какая-нибудь. Чтобы реально была сериализация и прочая фигня бесплатно
источник

t

toriningen in Haskell
Kir
https://hackage.haskell.org/package/free-5.1.6/docs/src/Control.Monad.Free.Ap.html#line-201

  Free m >>= f = Free ((>>= f) <$> m)
- каждый раз, когда вызывается >>= оно обходит всё дерево, заменяя узлы Pure a на f a. Каждый раз, сверху вниз.

Codensity m и его байнд устроен так, что он идёт от листьев, и всё дерево не обходится.

Когда же нужен Free f, то берётся Codensity (Free f) и разгибается через improve. И поскольку дерево было построено не через Free.>>= а через Codensity.>>= оно работает быстрее.
у вас текст не полностью скопировался? ._.
источник

K

Kir in Haskell
toriningen
а если вас не затруднит, то вы могли бы привести хотя бы небольшой пример того, как это могло бы происходить? это очень помогло бы построить интуицию насчет того, что это такое и как этим пользоваться
Извиняюсь, если запугал Codensit-ями, но я сам пытался въехать в то как они работают, но понял только зачем их применяют и как. Чёрная магия.
источник

K

Kir in Haskell
toriningen
у вас текст не полностью скопировался? ._.
Я подумал, что одной ветки хватит

instance Applicative f => Monad (Free f) where
 return = pure
 {-# INLINE return #-}
 Pure a >>= f = f a
 Free m >>= f = Free ((>>= f) <$> m)
источник

t

toriningen in Haskell
Kir
Я подумал, что одной ветки хватит

instance Applicative f => Monad (Free f) where
 return = pure
 {-# INLINE return #-}
 Pure a >>= f = f a
 Free m >>= f = Free ((>>= f) <$> m)
я про "же берёт Codensity"
источник

t

toriningen in Haskell
выглядит так, будто телега съела кусок текста из середины
источник

K

Kir in Haskell
Поправил
источник

KV

Kirill Valyavin in Haskell
Ох уж эти обобщения теоремы Кэли
источник

K

Kir in Haskell
Собсно, Codensity и есть наполовину применённый >>=, можно сказать что это FreeBind
источник

t

toriningen in Haskell
тут очень кстати был бы смайлик, ебашащийся головой об стену
источник

t

toriningen in Haskell
Kir
https://hackage.haskell.org/package/free-5.1.6/docs/src/Control.Monad.Free.Ap.html#line-201

  Free m >>= f = Free ((>>= f) <$> m)
- каждый раз, когда вызывается >>= оно обходит всё дерево, заменяя узлы Pure a на f a. Каждый раз, сверху вниз.

Codensity m и его байнд устроен так, что он идёт от листьев, и всё дерево не обходится.

Когда же нужен Free f, то берётся Codensity (Free f) и разгибается через improve. И поскольку дерево было построено не через Free.>>= а через Codensity.>>= оно работает быстрее.
пытаюсь понять, как должны выглядеть вычисления, которые начинаются с результата
источник

K

Kir in Haskell
toriningen
тут очень кстати был бы смайлик, ебашащийся головой об стену
Он изображал бы меня, пытавшегося пару лет назад всё-таки понять, как оно работает.

newtype Codensity m a = Codensity
 { runCodensity :: forall b. (a -> m b) -> m b
 }


Оно есть >>=, частично применённый к m a.

Как type Cont r a = (a -> r) -> r
источник

K

Kir in Haskell
toriningen
пытаюсь понять, как должны выглядеть вычисления, которые начинаются с результата
Они не начинаются с результата
источник

K

Kir in Haskell
Они начинаются с магии. У вас не просто шалаш из досок и гвоздей, они магические. Шалаш тот же самый, только строите вы его не за O(N^2), а за O(N)
источник

t

toriningen in Haskell
ну от меня смысл "правоассоциативного бинда" пока ускользает.
источник

KV

Kirill Valyavin in Haskell
https://arxiv.org/pdf/1406.4823.pdf
Тута написано
источник

KV

Kirill Valyavin in Haskell
toriningen
ну от меня смысл "правоассоциативного бинда" пока ускользает.
Ну Вы понимаете, зачем у списков ассоциировать конкатенацию?
источник

t

toriningen in Haskell
мне очень жаль, что я так жестко туплю :с наверное, таки спасибо и я пойду курить матчасть
источник