НизНазадКаталогРазвернуть изображения
/c/

「Haskell」

Аноним
GIqSnWaDsEx6 KB602x425haskell-png.png
Тред великого и могущественного языка ленивого теоретико-категорного функционального метапрограммирования.

Книги, туториалы, курсы, ресурсы:
https://www.haskell.org/documentation

Поиск материалов по базвордам:
https://haskellbazaar.com/

Гайд по хаскелю 2018 едишн, в котором особое внимание уделяется stack и расширениям компилятора:
https://lexi-lambda.github.io/blog/2018/02/10/an-opinionated-guide-to-haskell-in-2018/

ECS на хаскеле:
http://reasonablypolymorphic.com/blog/why-take-ecstasy/

Свежие откровения о свободных монадках:
https://reasonablypolymorphic.com/blog/freer-monads/

Свежий туториал по ST монаде на примере удаления дубликатов из списка за O(n):
https://medium.com/permutive/having-your-cake-and-eating-it-9f462bf3f908

Стрелочное переосмысление стейтмашин:
https://functional.works-hub.com/learn/afsm-arrowized-functional-state-machines-f0640
110 posts and 28 images omitted See All>>15111 #>>15269 #
Аноним
>>15076 #
Автомат с полем в 3,5x3,5 даже у пыхобляди заработает.
>>15079 #
Аноним
>>15078 #
Set Cost Centre. Такая хуйня, которую можно вешать на любое выражение, и благодаря которой очень удобно профилировать код и видеть ботлнеки.
В Rust, к примеру, мне этого очень нехватало.
https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/profiling.html#cost-centres-and-cost-centre-stacks
>>15077 #
Напиши и сравним, если хочешь. 30х30 это не так уж и мало, если учесть, что для кажого случая надо посчитать 10000 таких массивов, каждый на основании предыдущего, и делать это в 8 потоков, чтобы занять все ядра полезной работой и максимизировать скорость.
Аноним
GIqSnWaDs4.2 MB800x840cellular_n_4911703518825861715_0_10000.gif
Зделал генерацию гифок. С шагом в 100 на автоматах со случайным набором правил обычно нихуя не понять, зато можно увидеть интересные моменты и ...
>>15093 #
Аноним
>>15094 #
Сколько у тебя возможных состояний у клетки? И как правила выглядят?
Аноним
>>14104 #
В данном случае 3 состояния, правила такие:
[([1,1,1,1],2),([1,1,1,2],1),([1,1,1,3],2),([1,1,2,1],2),([1,1,2,2],3),([1,1,2,3],2),([1,1,3,1],1),([1,1,3,2],2),([1,1,3,3],3),([1,2,1,1],2),([1,2,1,2],3),([1,2,1,3],3),([1,2,2,1],2),([1,2,2,2],2),([1,2,2,3],3),([1,2,3,1],1),([1,2,3,2],3),([1,2,3,3],3),([1,3,1,1],3),([1,3,1,2],3),([1,3,1,3],2),([1,3,2,1],1),([1,3,2,2],2),([1,3,2,3],2),([1,3,3,1],3),([1,3,3,2],2),([1,3,3,3],2),([2,1,1,1],2),([2,1,1,2],1),([2,1,1,3],3),([2,1,2,1],1),([2,1,2,2],2),([2,1,2,3],1),([2,1,3,1],3),([2,1,3,2],1),([2,1,3,3],2),([2,2,1,1],3),([2,2,1,2],2),([2,2,1,3],2),([2,2,2,1],1),([2,2,2,2],2),([2,2,2,3],2),([2,2,3,1],1),([2,2,3,2],2),([2,2,3,3],2),([2,3,1,1],2),([2,3,1,2],1),([2,3,1,3],3),([2,3,2,1],3),([2,3,2,2],3),([2,3,2,3],2),([2,3,3,1],2),([2,3,3,2],3),([2,3,3,3],1),([3,1,1,1],1),([3,1,1,2],3),([3,1,1,3],3),([3,1,2,1],3),([3,1,2,2],2),([3,1,2,3],2),([3,1,3,1],1),([3,1,3,2],3),([3,1,3,3],1),([3,2,1,1],1),([3,2,1,2],3),([3,2,1,3],1),([3,2,2,1],1),([3,2,2,2],3),([3,2,2,3],2),([3,2,3,1],1),([3,2,3,2],3),([3,2,3,3],2),([3,3,1,1],1),([3,3,1,2],2),([3,3,1,3],3),([3,3,2,1],3),([3,3,2,2],3),([3,3,2,3],3),([3,3,3,1],2),([3,3,3,2],3),([3,3,3,3],2)]
Клетки вокруг доски например (0, -1) - фиксированное состояние 2.
>>15141 #
Аноним
Соседство наркоманское - фон Неймановское с вычеркнутой своей клеткой. Не знаю почему именно такая дрянь - первое что мне пришло в голову.
Я сейчас буду делать жидкость с самописными правилами, не представляю как такое вообще можно реализовать без рассмотрения своей клетки.
>>15113 #
Аноним
>>15112 #
> не представляю как такое вообще можно реализовать без рассмотрения своей клетки.
И конечно же я не буду пытаться так изъёбываться, я просто сделаю функцию соседства параметром, но не фунаргом, а зашью в адт кейсы, потому что хочу иметь Show и сохранять название функции соседства в имя сгенерированных файлов, чтобы потом можно было весь процесс реконструировать, как я реконструировал правила просто взяв seed из имени >>15094 #.
Аноним
>>15111 #
А твоё что-то не получается воспроизвести.
>>15199 #
Аноним
>>15132 #
>>15136 #
>>15138 #
Не запускаются эти видео в mp4 к сожалению.
>>15157 #
Вот это работает.
>>15141 #
Если что, там перечислены клетки в порядке [верх, низ, лево, право]. Своя клетка для принятия решения вообще не используется, в отличии от автомата жизнь. Я думаю что порядок имеет значение, автомат и его правила можно поворачивать на 90 градусов и некоторые варианты симметричны, другие нет. Думаю что [верх, низ, лево, право] будет вести себя так же как повернутый [лево, право, верх, низ], но вот [верх, лево, право, низ] будет вести себя совершенно иначе.
>>15204 #>>15254 #
Аноним
>>15138 #
Залей в webm плиз, интересно посмотреть. В mp4 у меня оно не запускается даже через сохранение на диск.
>>15204 #
Аноним
>>15204 #
У меня получилось через mpchc, >>15138 # красивый случай, сколько нагенерировал прежде чем на него наткнулся?
>>15211 #
Аноним
>>15211 #
Во всех этих случаях у тебя правила рассматривают 5 клеток (включая свою)?
>>15215 #
Аноним
>>15215 #
Если интересно, попробуй ещё 5 и 9 (с диагоналями).
Мне кажется там могут легко всякие биологически-химико-физические паттерны проскакивать.
Аноним
Аноним
>>15220 #
Не знаю, мне кажется что со случайным полем больше всего интересностей. Можно попробовать тупо пополам делить.
Аноним
GIqSnWaDs01:402.4 MB200x2001.webm
>>15199 #
Не получается, короче.

Скинул исходники https://gist.github.com/caziwasevu/d53aff70bb749f4545e561e19feacd42 , сам теперь развлекайся. Еще можешь сравнить быстродействие со своим вариантом. Я вроде сделал, чтоб было минимум аллокаций, и профайлер показывает, что всё самое тяжелое - в random, но хуй его знает.
>>15284 #>>15285 #
Аноним
Как в этом вашем хачки значение из MonadRandom получить?
>>15284 #
Аноним
>>15254 #
Нихуя ты маньяк. Пропсы какие-то, чашка петри, эрвары, мутабельное петушение анбокс векторов, ППМ в ффмпег на выхлопе. Я бля вообще не знал что так можно. Спасибо что поделился, это прям урок по хачкелю ещё и с фокусами как без либ делать видосы быстрее чем через либы. А я обнаружил у себя что 99% времени занимает рендеринг конечных картинок, сейчас прикрутил JuicyPixels, ещё не доделал. Думаю что будет гораздо быстрее, но без простого способа добавить строку с номером итерации как я кидал выше.
>>15283 #
x <- liftRand (randomR (10, 20)) например
>>15287 #
Аноним
>>15284 #
Не, падажи, вот есть у меня мондада x (MonadRandom). Я что, из нее не могу выскочить, как из IO? Вот для State есть всякие runState, evalState, execState, а для MonadRandom как? Доки хачкевские не понимаю.
>>15288 #
Аноним
GIqSnWaDs3.6 MB256x256ca_3_64_2566453264719809929_vnwc_0_1000_5.gif
Наконец-то доделал альтернативный рендеринг через JuicyPixels, стало примерно в 100500 раз быстрее.
Нашёл новых паттернов интересных, нашёл ещё один автомат похожий на >>15094 #. Чуть позже попробую кратко классифировать.
>>15338 #>>15337 #
Аноним
>>15336 #
На параллакс местности какой-то похоже.
Аноним
GIqSnWaDs782 KB256x256ca_3_64_7813909929750961757_vnwc_0_300_5.gif
Для вычеркнутого соседства фон неймана с 3мя состояниями, наиболее часто встречающиеся паттерны таковы:
- всё уползает в определённую сторону
- всё растворяется, оставляя небольшие устойчивые фрагменты
- двигающиеся диагонали
- лабиринты превращающиеся в перпендикулярные друг другу наборы двигающихся параллельных прямых
- большие мерцающие кластера превращаются в устойчивые решетки

В классификации https://en.wikipedia.org/wiki/Cellular_automaton#Classification это всё классы 2-4.
>>15432 #>>15437 #
Аноним
>>15343 #
Правила в известных автоматах очень симметричные. В "Жизни" так вообще рассматриваются количества живых и мертвых клеток.
>>15443 #
Аноним
GIqSnWaDs2.7 MB512x512juicy_f_128_911_vn_1_200_5.gif
Вообще я делал водичку, на так как работал с фон Неймановским соседством, у меня получился песок.
Теперь буду делать водичку с соседством Мура.
>>15437 #
И я думаю эта симметрия является ограничением следующим из соседства. К примеру когда я в прикриплейтед пытался делать неравномерное распространение материи в стороны и вниз, у меня выходил фейл, нарущающий закон сохранения. Пришлось распространять песочек равномерно в стороны и вниз. В соседстве Мура будет проще, потому что доступно лево и право не только своей, но и верхней клетки.
>>15444 #
Аноним
>>15443 #
Пикрил чуть более наглядный пример ограничений соседства фон Неймана: внизу не получается сделать горизонтальное распространение жидкости внутри щели не проёбывая закон сохранения количества жидкости на других кейсах правил.
>>15445 #
Аноним
>>15458 #
Мне инстанс монады для списка кажется вполне логичным. Он удовлетворяет Monad Laws, физический смысл - недетерминированные вычисления, синтаксический смысл - оператор amb из всяких древних лиспов и компсцай эзотерики, плюс работа с ним в do-нотации выглядит очень похоже на list comprehensions:

do x <- [1..10]
y <- [1..10]
return (x, y)

[(x, y) | x <- [1..10], y <- [1..10]]
>>15460 #>>15468 #
Аноним
>>15459 #
> Мне инстанс монады для списка кажется вполне логичным
А мне нет.
Аноним
>>15468 #
Согласен, что так было бы лучше для конкретно туплов, но для нашего случая понадобилось бы ещё [1..10]^n,
что было бы очень проблематично выразить на хаскеле, и более того, это пришлось бы ещё и как-то матчить чтобы конвертнуть в список.
>>15470 #>>15480 #
Аноним
>>15469 #
>что было бы очень проблематично выразить на хаскеле
Так хачкель и нинужен.
>>15476 #
Аноним
>>15470 #
А что ты предлагаешь?
Аноним
>>15469 #
>что было бы очень проблематично выразить на хаскеле

import qualified Prelude
import Control.Monad
a * b = do { x <- a; y <- b; Prelude.return (x,y) }
a ^ n = replicateM n a
>>15481 #
Аноним
>>15480 #
Ну, почему бы и нет.
Но в библиотеку такое не захотели бы, потому что:
xs:: [a]
xs * xs :: [(a, a)]
xs ^ 2 :: [[a]]
>>15485 #
Аноним
>>15481 #
Не обратил внимания. a * b = do { x <- a; y <- b; Prelude.return [x,y] }, конечно же.
>>15486 #
Аноним
>>15485 #
Я совсем не против (не считая того, что надо как-то разрулить конфликт имён с обычным умножением чисел). Плюс математики начнут ругаться, что хотят видеть там туплы. Плюс в Control.Arrow есть весьма популярный оператор (*), а он работает с туплами.
>>15487 #
Аноним
>>15487 #
> весьма популярный
Аноним
GIqSnWaDsEx70 KB835x841better_validation.png
Придумал как прокачать валидацию. Теперь валидаторы не только для сопоставления двух итераций, но и просто для проверок в рамках одной итерации.
Аноним
GIqSnWaDs6.4 MB512x512jpx_f_128_1122_mo_0_450_d5.gif
Вжух. Ох я и заебался пока это подкручивал чтобы убрать назойливые бесконечные осциляции на поверхности воды.
Аноним
Аноним
>>15580 #
Не думал на SDL рендерить? Мне каж, намного быстрее будет.
>>15644 #
Аноним
>>15640 #
> рендерить анимацию на экран быстрее чем в гифку
Да неужели.
А вообще, если бы я собирался это использовать в 2д игре, то это имело бы смысл.
Но я это собираюсь использовать только в 3д, так что лучше сразу на геометрических шейдерах воксельный движок делать.
>>15655 #
Аноним
А моноцвет - это не оптимизация, а эстетика. Например, в 2д платформере стоило бы очень серьёзно задуматься над тем, стоит ли делать градации синего для такой воды или нет, потому что эти оттенки слишком много на себя внимания забирают, плюс могут утомлять глаза, плюс с единым цветом физика происходящего становится более волшебной.

Кстати, я сейчас задумался, если состояния - цвета пикселей, то окрестность Мура - это ядро, а шаг автомата - свёртка:
https://en.wikipedia.org/wiki/Kernel_(image_processing)
Аноним
>>15644 #
В смысле, рендерить в текстуру, потом делать из нее гифку.
>>15658 #
Аноним
GIqSnWaDsEx30 KB894x500gif_rendering.png
>>15655 #
Это как-то совсем избыточно. Сейчас напрямую из анбоксед вектора делается гифка, вряд ли это можно ускорить при помощи добавления промежуточной текстуры. JuicyPixels - это чисто библиотека для работы с форматами изображений, у неё нет своего рисования, которое могло бы тормозить, как в случае с diagrams. Пикрил можно немного ускорить заменив два M.! на что-то получше. Как минимум второй M.! можно заменить на V.!, если занумеровать пространство состояний интами. Но в автоматах итт эти лукапы и так очень дешевые, потому что размеры этих мапов не больше 5 элементов.
>>15721 #
Аноним
GIqSnWaDs2.1 MB512x538dia_f_64_7676_vn_0_10_d50.gif
> если состояния - цвета пикселей, то окрестность Мура - это ядро, а шаг автомата - свёртка
Blur в хату.
>>15666 #
Аноним
>>15665 #
Пикрил соответствует ядру 1/8 *
0 1 0
1 4 1
0 1 0
Аноним
>>15721 #
Уж понапрямее чем сгенерировать картинки и скормить какой-то залупе которой придётся парсить палитру из каждого изображения отдельно и распознавать что она у всех одинаковая чтобы вставить её в глобальную и всё равно делать все те же индексации только на такой-то скоростной языкнейм.
>>15737 #
Аноним
>>15741 #
Два дебила это сила! Простите за каламбур.
Аноним
No matter how good the algebra and free monad interpreter were, there would be unresolvable quality issues that would be blamed on the algebra and monad rather than the underlying Spark implementation.
>>15766 #
Аноним
>>15758 #
Я когда впервые хаскелем упарывался, слишком много внимания уделял заворачиванию всего и вся в модульные обобщённые монадические слои. В результате всё очень медленно писалось, и оставалась какая-то постоянная неудовлетворённость, что истинный чистый идеал всё-таки ещё не достигнут. Сейчас иду противоположным путём, даже RandomGen вручную пробрасываю, и вижу что для меня это гораздо продуктивнее, во многих отношениях. Хотя ту же стейт монаду использую, но только локально на комбинаторах, а не тащу все свои вычисления внутрь MonadState.
>>15775 #>>15855 #
Аноним
>>15766 #
Дай угадаю: до этого писал на ДЖЯВЕ?
Аноним
Как понять, чему будет равно (Just (-1/0 :: Float)) `compare` (Nothing), используя только хачкедоки (без сорцов, без гугла, без ghci и прочего)?
>>15778 #
Аноним
Мдаа
Аноним
>>15778 #
Спасибо. Я всё искал пример образцово-показательно хуёвой доки для своей книги. Теперь я его нашел. %%Но книгу всё равно не напишу, я же ленивая хуила.%%
Аноним
СПЕЦОЛИМПИАДА

Написать программу в point-free стиле, которая запрашивает целое число и выводит его факториал. Если число не парсится, программа запрашивает его снова.
Аноним
>>15855 #
Фу, блядь. Унеси это говно обратно в то антикафе, из которого ты его достал.
>>15984 #
Аноним
>>15926 #
Антикафе для нищуков, индустриальные господа предпочитают полноценные рестораны.
>>15985 #>>15988 #>>16006 #
Аноним
>>15984 #
Индустриальные господа предпочитают заниматься серьезными делами, а не кодингом на хакатонах.
>>16006 #
Аноним
>>15984 #
В рестораны ходят провинциальные мажоры, индустриальные господа греют замороженные продукты в промышленной микроволновке на 10 киловатт.
>>15994 #>>16006 #
Аноним
>>15988 #
Или жарят их, пиздя ладонью, разогнанной до 5996.34 км/ч.
>>16006 #
Аноним
>>15984 #
>>15985 #
>>15988 #
>>15994 #
Индустриальные господа пьют сойлент во время пробежки вокруг своей фермы асиков, работающей на солнечных батареях.
>>16067 #
Аноним
>>16006 #
>Индустриальные господа
>солнечных батареях
Лол, ты что-то попутала, зеленая маня. Индустриальные господа пользуются исключительно ядерной энергией.

НазадКаталогВерх