Sr
Я просто заебался всегда мыслить задом наперед, вот и замутил себе)
Cheese
Sr
А флипнутый доллар там есть?
Зигохистоморфный
Cheese
Data.Function.&
Зигохистоморфный
в Data.Function
Sr
Спасибо
Ю ли я? 🤔
&
Вот странный выбор символа, кмк
Sr
И все же к теме, рекурсивные лямбда норм или нет?
Зигохистоморфный
в пурсе это #
Cheese
Cheese
в пурсе это #
и в некоторых хаскельных библиотеках тоже. например, diagrams
Sr
Что за пурс, о чём речь?
Sr
Kirill
это, а https://github.com/haskell-wasm/wasm это не твиговое и от @irezvov же?
Kirill
Cheese
лучший квазихаскель в браузере
Cheese
Sr
Cheese
только GHCJS выглядит как монстр франкенштейна
Sr
хотя мы же о JS в котором по 7 фреймворков на неделе? всё ок))
Cheese
ну вот хаскелей всего 3 в течение уже нескольких лет
Cheese
GHCJS тормозит и глючит, Elm слишком скуден, PureScript
Cheese
главная проблема PureScript в том, что он не Хаскель, а в остальном вполне ок
Cheese
ну и версии для Wasm на подходе
Sr
лан, я в веб не суюсь, хочу закрыть тему) не мне судить там где меня нет))
Sr
ys = fix (\f -> \case {[] -> []; x:y:ys -> (x,y) : f ys}) xs
интересно, можно ещё короче?
A64m
A64m
занимаются два человека, один в свободное время, у второго адовый проект, не особо реалистичный. третий уже переключился на бекенд для идриса
Ilya
Kirill
а по смыслу тоже самое вид сбоку?
кана
Sr
у фикса как бы арность не та что бы флипать
Sr
или я чего-то не догоняю?
кана
ys = flip fix xs $ \next -> \case
x:y:ys -> (x, y) : next ys
_ -> []
кана
Так я выше кинул код
Kirill
вообще в хаскеле арности нет :)
Cheese
или она всегда 1
Sr
Sr
с флипом длиньше
Sr
кана
Так дело не в длине кек
кана
Я еще и функцию переписал тебе, чтобы она не была частичной
кана
В твоём кейсе возможны рантайм-падения
Sr
так а тут по подробнее
Sr
ааа
Sr
понял
Sr
да за это замечание спасибо
кана
Можно через unfoldr ещё
Sr
кана
import Data.List (unfoldr)
f :: [a] -> [(a, a)]
f = unfoldr $ \case
x:y:ys -> Just ((x, y), ys)
_ -> Nothing
Sr
кана
Где?
кана
Нет, там все верно
Sr
О_О
кана
unfoldr
:: (b -> Maybe (a, b))
-> b
-> [a]
Sr
какая странная функция
Sr
но эти just и Nothing слишком громоздкие
Sr
мне вот так больше нравится. выглядит минималистично
xs & fix (\f -> \case {x:y:ys -> (x,y) : f ys; _ -> []})
кана
Да нет, она довольно естественна
кана
Зига бы сейчас про анаморфмзм рассказал
Sr
я сегодня кстати был неожиданно удивлён когда узнал про реально существющий зигохистоморфный препроморфизм
Sr
прям в осадок выпал
кана
Зигоморфизм — генерализация параморфизма, которая повзволяет фолдить структуру с помощью вспомогательной функции
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
Продолжение следует
Sr
Ilya
занимаются два человека, один в свободное время, у второго адовый проект, не особо реалистичный. третий уже переключился на бекенд для идриса
я кстати переключился на идрис только потому что его легко написать и что бы отработать апишечки для haskell-wasm либы. изначально план был особо не влезать, но оказалось что для идриса можно за пару недель написать бекендик. из большого осталось заимплементить big num либу на WASM для базовой идрис имплементации. Это кстати дало неплохое понимание как лучше делать компиляцию Haskell'я в WASM. Сейчас мне более правильным кажется подход трансляции STG в идрисоподобный байткод(и возможно шаринг компонентов рантайма между идрисовой и хаскельной имплементацией), а не компиляция Cmm в Wasm. В общем, у меня в планах в ближайшее время вернуться к хаскельному компилеру. возможно в рамках Asterius'a, возможно своим путём