Sr
Я просто заебался всегда мыслить задом наперед, вот и замутил себе)
Sr
не канонично. должно быть >>>
Тип флипнутая стрелка уже есть? Что за модуль?
Sr
А флипнутый доллар там есть?
Зигохистоморфный
Cheese
Data.Function.&
Зигохистоморфный
в Data.Function
Sr
Спасибо
Ю ли я? 🤔
&
Вот странный выбор символа, кмк
Sr
И все же к теме, рекурсивные лямбда норм или нет?
Зигохистоморфный
в пурсе это #
Cheese
в пурсе это #
и в некоторых хаскельных библиотеках тоже. например, diagrams
Kirill
в пурсе это #
типа символ фунта как флипнутый бакс?
Sr
Что за пурс, о чём речь?
Kirill
это, а https://github.com/haskell-wasm/wasm это не твиговое и от @irezvov же?
Sr
Purescript
yet another FP lang? omg
Cheese
yet another FP lang? omg
почему yet another? позиции его довольно прочны
Sr
почему yet another? позиции его довольно прочны
ну а с чего бы любой существующий FP не научить компиляться в javascript?
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
ну и версии для Wasm на подходе
ну не знаю, насчет "на подходе"
A64m
или есть yet another GHC extension где можно в именованные лямбды?
это обычные функции, прямо в стандарте есть
Cheese
ну не знаю, насчет "на подходе"
несколько команд занимаются, как выяснилось
A64m
занимаются два человека, один в свободное время, у второго адовый проект, не особо реалистичный. третий уже переключился на бекенд для идриса
Kirill
а по смыслу тоже самое вид сбоку?
кана
Можно еще fix флипнуть
Sr
у фикса как бы арность не та что бы флипать
Sr
или я чего-то не догоняю?
кана
ys = flip fix xs $ \next -> \case x:y:ys -> (x, y) : next ys _ -> []
кана
у фикса как бы арность не та что бы флипать
у id тоже арность не та, но попробуй :t flip id сделать
Sr
у id тоже арность не та, но попробуй :t flip id сделать
хорошо, но я не понимаю что ты хочешь получить в итоге...
кана
Так я выше кинул код
Kirill
вообще в хаскеле арности нет :)
Sr
вообще в хаскеле арности нет :)
T__T (бывший оопшник пошёл плакать)
Cheese
или она всегда 1
кана
хорошо, но я не понимаю что ты хочешь получить в итоге...
Ты избавляешься от лишних скобок и уродского аргумента в конце без отступа
Sr
с флипом длиньше
Sr
кана
Так дело не в длине кек
кана
Я еще и функцию переписал тебе, чтобы она не была частичной
кана
В твоём кейсе возможны рантайм-падения
Sr
так а тут по подробнее
Sr
ааа
Sr
понял
Sr
да за это замечание спасибо
кана
Можно через unfoldr ещё
кана
import Data.List (unfoldr) f :: [a] -> [(a, a)] f = unfoldr $ \case x:y:ys -> Just ((x, y), ys) _ -> Nothing
кана
Где?
кана
Нет, там все верно
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
прям в осадок выпал
Sr
Зига бы сейчас про анаморфмзм рассказал
кстати именно выражение анаморфные лямбды я и вышел на функцию fix и рекурсию в лямбдах
кана
Зигоморфизм — генерализация параморфизма, которая повзволяет фолдить структуру с помощью вспомогательной функции 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 Продолжение следует
кана
кстати именно выражение анаморфные лямбды я и вышел на функцию fix и рекурсию в лямбдах
Ну так да, потому что ты навелосипедил вручную анфолдр, который есть анаморфизм для списков Анфолд делает ровно твой код, но он абстрагирует тебя от вызова рекурсии (как и map/foldr) Если бы я писал код, то однозначно оставил бы unfoldr, вместо того, чтобы заставлять будущего себя парсить фиксы
Ilya
занимаются два человека, один в свободное время, у второго адовый проект, не особо реалистичный. третий уже переключился на бекенд для идриса
я кстати переключился на идрис только потому что его легко написать и что бы отработать апишечки для haskell-wasm либы. изначально план был особо не влезать, но оказалось что для идриса можно за пару недель написать бекендик. из большого осталось заимплементить big num либу на WASM для базовой идрис имплементации. Это кстати дало неплохое понимание как лучше делать компиляцию Haskell'я в WASM. Сейчас мне более правильным кажется подход трансляции STG в идрисоподобный байткод(и возможно шаринг компонентов рантайма между идрисовой и хаскельной имплементацией), а не компиляция Cmm в Wasm. В общем, у меня в планах в ближайшее время вернуться к хаскельному компилеру. возможно в рамках Asterius'a, возможно своим путём