
Denis
30.05.2018
19:01:31
в пурсе это #

Yuriy
30.05.2018
19:02:01
в пурсе это #
и в некоторых хаскельных библиотеках тоже. например, diagrams

Kirill
30.05.2018
19:03:46

Google

Stepan
30.05.2018
19:04:08
Что за пурс, о чём речь?

Kirill
30.05.2018
19:05:06
это, а https://github.com/haskell-wasm/wasm это не твиговое и от @irezvov же?

Stepan
30.05.2018
19:07:50

Yuriy
30.05.2018
19:09:25

Stepan
30.05.2018
19:10:03

Yuriy
30.05.2018
19:10:26
лучший квазихаскель в браузере

Stepan
30.05.2018
19:10:54

Yuriy
30.05.2018
19:11:01

Stepan
30.05.2018
19:11:15

Yuriy
30.05.2018
19:11:40
только GHCJS выглядит как монстр франкенштейна

Stepan
30.05.2018
19:12:06
хотя мы же о JS в котором по 7 фреймворков на неделе? всё ок))

Google

Yuriy
30.05.2018
19:13:14
ну вот хаскелей всего 3 в течение уже нескольких лет
GHCJS тормозит и глючит, Elm слишком скуден, PureScript
главная проблема PureScript в том, что он не Хаскель, а в остальном вполне ок
ну и версии для Wasm на подходе

Stepan
30.05.2018
19:15:35
лан, я в веб не суюсь, хочу закрыть тему) не мне судить там где меня нет))
ys = fix (\f -> \case {[] -> []; x:y:ys -> (x,y) : f ys}) xs
интересно, можно ещё короче?

A64m
30.05.2018
19:21:08

Yuriy
30.05.2018
19:23:47

A64m
30.05.2018
19:25:23
занимаются два человека, один в свободное время, у второго адовый проект, не особо реалистичный. третий уже переключился на бекенд для идриса

Ilya
30.05.2018
19:30:18

Kirill
30.05.2018
19:44:08
а по смыслу тоже самое вид сбоку?

kana
30.05.2018
19:47:27
Можно еще fix флипнуть

Stepan
30.05.2018
19:48:17
у фикса как бы арность не та что бы флипать
или я чего-то не догоняю?

kana
30.05.2018
19:49:03
ys = flip fix xs $ \next -> \case
x:y:ys -> (x, y) : next ys
_ -> []

Stepan
30.05.2018
19:52:03

kana
30.05.2018
19:52:13
Так я выше кинул код

Kirill
30.05.2018
19:52:24
вообще в хаскеле арности нет :)

Google

Stepan
30.05.2018
19:52:47

Yuriy
30.05.2018
19:52:49
или она всегда 1

kana
30.05.2018
19:53:53

Stepan
30.05.2018
19:55:26
с флипом длиньше

kana
30.05.2018
19:55:56
Так дело не в длине кек
Я еще и функцию переписал тебе, чтобы она не была частичной
В твоём кейсе возможны рантайм-падения

Stepan
30.05.2018
19:56:58
так а тут по подробнее
ааа
понял
да за это замечание спасибо

kana
30.05.2018
20:00:40
Можно через unfoldr ещё

Stepan
30.05.2018
20:01:05

kana
30.05.2018
20:01:39
import Data.List (unfoldr)
f :: [a] -> [(a, a)]
f = unfoldr $ \case
x:y:ys -> Just ((x, y), ys)
_ -> Nothing

Stepan
30.05.2018
20:03:18

kana
30.05.2018
20:03:38
Где?
Нет, там все верно

Stepan
30.05.2018
20:04:07
О_О

kana
30.05.2018
20:04:10
unfoldr
:: (b -> Maybe (a, b))
-> b
-> [a]

Google

Stepan
30.05.2018
20:05:25
какая странная функция
но эти just и Nothing слишком громоздкие
мне вот так больше нравится. выглядит минималистично
xs & fix (\f -> \case {x:y:ys -> (x,y) : f ys; _ -> []})

kana
30.05.2018
20:06:50
Да нет, она довольно естественна
Зига бы сейчас про анаморфмзм рассказал

Stepan
30.05.2018
20:08:21
я сегодня кстати был неожиданно удивлён когда узнал про реально существющий зигохистоморфный препроморфизм
прям в осадок выпал


kana
30.05.2018
20:10:13
Зигоморфизм — генерализация параморфизма, которая повзволяет фолдить структуру с помощью вспомогательной функции
zygo :: Functor f => Algebra f b -> (f (a, b) -> a) {- следовало бы и здесь алгебру определить -} -> Mu f -> a
zygo f g = fst . cata (g &&& f . fmap snd)
Препроморфизм — катаморфизм с дополнительным естественным преобразованием, которое применяется перед интерпретацией через представленную Ф-алгебру на каждой итерации рекурсивной процедуры
prepro g f = f . (fmap . prepro . cata (Mu . g)) f . out
Постпроморфизм — корекурсивная схема, являющаяся дуализмом к препроморфизму, позволяющая с помощью соответствующего естественного преобразования генерировать коданные.
Постпроморфизм можно представить в виде генератора. К примеру функция вычисления факториала на питоне с помощью генератора будет выглядеть примерно так
def fac(a):
n, f = 0, 1
while n < a:
n, f = n + 1, f * (n + 1)
yield f
На хаскелле с использованием постпроморфизма
fac = flip postpro stream . phi
where stream = Cons <*> succ
phi _ Nil = Nil
phi n alg@(Cons a b)
| a <= n = alg
| otherwise = Nil
Хистоморфизм — генерализация катаморфизма на косвободной комонаде, изменяющий форму фолд, сохраняющий всю историю значений во время рекурсивной процедуры, нежели чем самый последний элемент. Основное применение хистоморфизма используется для мемоизации.
histo :: Functor f => CVAlgebra f a -> Mu f -> a
histo f = out >>> fmap phi >>> f where
phi t = (Cofree . Mu .: CoBindF) (histo f t) ((out t) <&> uncofree . phi)
Футуморфизм — дуализм к хистоморфизму, ана на свободной монаде, конструирует Ф-алгебраическую структуру пошагово где коалгебра может вернуть несколько уровней подструктуры одновременно
futu :: Functor f => CVCoalgebra f a -> a -> Mu f
futu f = Mu <<< fmap phi <<< f
where phi (Free(Mu(ReturnF a))) = futu f a
phi (Free(Mu(BindF a))) = (Mu .: fmap) phi a)
* Следует также прочесть
cs.ox.ac.uk/people/daniel.james/sorting/sorting.pdf
cs.ox.ac.uk/people/nicolas.wu/publications/Histomorphisms.pdf
cs.cornell.edu/~jeannin/papers/wf.pdf
citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.41.125&rep=rep1&type=pdf
† Элгот алгебры
iti.cs.tu-bs.de/~milius/research/elgot_lmcs.pdf
comonad.com/reader/2008/elgot-coalgebras
‡ Насчёт имплементации по Мендлеру
researchgate.net/publication/244249998_Coding_Recursion_a_la_Mendler_Extended_Abstract
researchgate.net/publication/220370687_The_Recursion_Scheme_from_the_Cofree_Recursive_Comonad
Продолжение следует


Stepan
30.05.2018
20:12:32


Ilya
30.05.2018
20:24:50
занимаются два человека, один в свободное время, у второго адовый проект, не особо реалистичный. третий уже переключился на бекенд для идриса
я кстати переключился на идрис только потому что его легко написать и что бы отработать апишечки для haskell-wasm либы. изначально план был особо не влезать, но оказалось что для идриса можно за пару недель написать бекендик. из большого осталось заимплементить big num либу на WASM для базовой идрис имплементации. Это кстати дало неплохое понимание как лучше делать компиляцию Haskell'я в WASM. Сейчас мне более правильным кажется подход трансляции STG в идрисоподобный байткод(и возможно шаринг компонентов рантайма между идрисовой и хаскельной имплементацией), а не компиляция Cmm в Wasm. В общем, у меня в планах в ближайшее время вернуться к хаскельному компилеру. возможно в рамках Asterius'a, возможно своим путём
вообще меня радует что есть уже две с половиной попытки пойти в сторону компиляции хаскеля в васм. это движение в верную сторону, когда-нибудь количество перейдет в качество. Ещё в январе на горизонте вообще ничего не было


A64m
30.05.2018
20:26:35
так имплементировать ленивые языки вообще сильно сложнее чем строгие, конечно для идриса или там пурскрипта должно быть легче сделать бекенд
не, webghc это прошлогодний hsoc

Ilya
30.05.2018
20:27:12
да, в том числе понимание этих нюансов особенно отчетливо после идриса пришло

A64m
30.05.2018
20:27:54
т.е. про такой проект уже год известно

Ilya
30.05.2018
20:28:24
я его не нашел когда ресёрчил кстати ?
а так в идрисе тоже есть ленивость, впринципе можно для всех типов дописать Lazy и будет вполне себе хаскель
правда код в этом случае не самый эффективный сгенерится

Google

A64m
30.05.2018
20:35:30
нету, или не было до недавнего времени, по крайней мере
там Lazy не кеширует результат вычисления

Ilya
30.05.2018
20:36:41
тоже правда

A64m
30.05.2018
20:36:45
так что там не то что неэффективность - будет другая асимптотика
тем временем поиск подстановок в дырки успел в 8.6
https://github.com/ghc/ghc/commit/e0b44e2eccd4053852b6c4c3de75a714301ec080
не языковая фича, но интересная

Евгений
30.05.2018
21:28:01

A64m
30.05.2018
21:29:22
да, в районе первой версии когда я мультиленгвидж фп-бенчмарк делал так было, сейчас может поменялось, не знаю


Imants
30.05.2018
21:32:21
Зигоморфизм — генерализация параморфизма, которая повзволяет фолдить структуру с помощью вспомогательной функции
zygo :: Functor f => Algebra f b -> (f (a, b) -> a) {- следовало бы и здесь алгебру определить -} -> Mu f -> a
zygo f g = fst . cata (g &&& f . fmap snd)
Препроморфизм — катаморфизм с дополнительным естественным преобразованием, которое применяется перед интерпретацией через представленную Ф-алгебру на каждой итерации рекурсивной процедуры
prepro g f = f . (fmap . prepro . cata (Mu . g)) f . out
Постпроморфизм — корекурсивная схема, являющаяся дуализмом к препроморфизму, позволяющая с помощью соответствующего естественного преобразования генерировать коданные.
Постпроморфизм можно представить в виде генератора. К примеру функция вычисления факториала на питоне с помощью генератора будет выглядеть примерно так
def fac(a):
n, f = 0, 1
while n < a:
n, f = n + 1, f * (n + 1)
yield f
На хаскелле с использованием постпроморфизма
fac = flip postpro stream . phi
where stream = Cons <*> succ
phi _ Nil = Nil
phi n alg@(Cons a b)
| a <= n = alg
| otherwise = Nil
Хистоморфизм — генерализация катаморфизма на косвободной комонаде, изменяющий форму фолд, сохраняющий всю историю значений во время рекурсивной процедуры, нежели чем самый последний элемент. Основное применение хистоморфизма используется для мемоизации.
histo :: Functor f => CVAlgebra f a -> Mu f -> a
histo f = out >>> fmap phi >>> f where
phi t = (Cofree . Mu .: CoBindF) (histo f t) ((out t) <&> uncofree . phi)
Футуморфизм — дуализм к хистоморфизму, ана на свободной монаде, конструирует Ф-алгебраическую структуру пошагово где коалгебра может вернуть несколько уровней подструктуры одновременно
futu :: Functor f => CVCoalgebra f a -> a -> Mu f
futu f = Mu <<< fmap phi <<< f
where phi (Free(Mu(ReturnF a))) = futu f a
phi (Free(Mu(BindF a))) = (Mu .: fmap) phi a)
* Следует также прочесть
cs.ox.ac.uk/people/daniel.james/sorting/sorting.pdf
cs.ox.ac.uk/people/nicolas.wu/publications/Histomorphisms.pdf
cs.cornell.edu/~jeannin/papers/wf.pdf
citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.41.125&rep=rep1&type=pdf
† Элгот алгебры
iti.cs.tu-bs.de/~milius/research/elgot_lmcs.pdf
comonad.com/reader/2008/elgot-coalgebras
‡ Насчёт имплементации по Мендлеру
researchgate.net/publication/244249998_Coding_Recursion_a_la_Mendler_Extended_Abstract
researchgate.net/publication/220370687_The_Recursion_Scheme_from_the_Cofree_Recursive_Comonad
Продолжение следует
Статья на эту же тему, правда?
https://jtobin.io/time-traveling-recursion


Dmitry
30.05.2018
22:34:17

Aleksey
31.05.2018
04:47:53

Dmitry
31.05.2018
04:48:50
Нуу, c или basic в качестве имени функции как-то странно использовать. Вот go -- самое то!

Aleksey
31.05.2018
05:43:27
Вот чтобы не придумывать ненужные имена, анонимные функции и существуют :) Для такой тривиальной задачи точно стоит unfoldr использовать, а не руками рекурсию писать.
А go можно оставить для тех случаев, когда размер функции довольно большой :)

Stepan
31.05.2018
06:39:04
А тут целых три!
Ладно две, но не одна ведь!
Можно и в одну, но опять же вызвать отдельно придётся