@haskellru

Страница 1232 из 1551
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
Purescript
yet another FP lang? omg

Yuriy
30.05.2018
19:09:25
yet another FP lang? omg
почему yet another? позиции его довольно прочны

Stepan
30.05.2018
19:10:03
почему yet another? позиции его довольно прочны
ну а с чего бы любой существующий FP не научить компиляться в javascript?

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

Stepan
30.05.2018
19:10:54
лучший квазихаскель в браузере
не лучше хаскеля если последнего научить в браузер

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
ну и версии для Wasm на подходе
ну не знаю, насчет "на подходе"

или есть yet another GHC extension где можно в именованные лямбды?
это обычные функции, прямо в стандарте есть

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 _ -> []

у фикса как бы арность не та что бы флипать
у id тоже арность не та, но попробуй :t flip id сделать

Stepan
30.05.2018
19:52:03
у id тоже арность не та, но попробуй :t flip id сделать
хорошо, но я не понимаю что ты хочешь получить в итоге...

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

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

Google
Stepan
30.05.2018
19:52:47
вообще в хаскеле арности нет :)
T__T (бывший оопшник пошёл плакать)

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

kana
30.05.2018
19:53:53
хорошо, но я не понимаю что ты хочешь получить в итоге...
Ты избавляешься от лишних скобок и уродского аргумента в конце без отступа

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

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
я сегодня кстати был неожиданно удивлён когда узнал про реально существющий зигохистоморфный препроморфизм

прям в осадок выпал

Зига бы сейчас про анаморфмзм рассказал
кстати именно выражение анаморфные лямбды я и вышел на функцию fix и рекурсию в лямбдах

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 Продолжение следует

кстати именно выражение анаморфные лямбды я и вышел на функцию fix и рекурсию в лямбдах
Ну так да, потому что ты навелосипедил вручную анфолдр, который есть анаморфизм для списков Анфолд делает ровно твой код, но он абстрагирует тебя от вызова рекурсии (как и map/foldr) Если бы я писал код, то однозначно оставил бы unfoldr, вместо того, чтобы заставлять будущего себя парсить фиксы

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
там Lazy не кеширует результат вычисления
То есть Lazy это на самом деле call-by-name?

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
import Data.List (unfoldr) f :: [a] -> [(a, a)] f = unfoldr $ \case x:y:ys -> Just ((x, y), ys) _ -> Nothing
go :: [a] -> [(a, a)] go (x:y:zs) = (x, y) : go zs go _ = [] Хоть понятнее ;)

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
А тут целых три!

Ладно две, но не одна ведь!

Можно и в одну, но опять же вызвать отдельно придётся

Страница 1232 из 1551