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

「Haskell」

Аноним
GYdIqSnWaDsEx6 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
>>14127 #>>14275 #>>15269 #>>14119 #>>14388 #>>14389 #>>14594 #>>15111 #>>16518 #
Аноним
GYdIqSnWaDsEx55 KB480x4801445968628218.jpg
Интересно, чё там со Стасиком? Наверное спился окончательно в своём Люксофте...
>>14117 #
Аноним
GYdIqSnWaDsEx24 KB655x227Screenshot_20190215_223543.png

>>14110 #
Судя по жидхабу, жив-здоров. Последняя опенсос активность 3 недели назад, куча коммитов, ишью, обсуждений и всё хачки-рилейтед. Не буду палить репо, если захочет сам вбросит как-нибудь. Если тред взлетит, можно будет попробовать его оттуда зассумонить.
Аноним
GYdIqSnWaDsEx12 KB400x4006UQFD8wV_400x400.jpg
>>14104 #
Твои великие и могущественные метапрограммисты сосут с проглотом у идрисобогов. Кому вообще в 2К19 нужен язык без линейных типов?
>>14120 #
Аноним
GYdIqSnWaDsEx8 KB283x258Screenshot_20190215_233228.png
>>14119 #
Линейные типы важны если ты очень много работаешь с ресурсами, например в байтоёбском языке без сборщика мусора вроде Rust. Там они на каждом шагу используются.
В хаскеле они тоже нужны, и о том, как их добавить, и стоит ли оно того, думают уже некоторое время:
https://ghc.haskell.org/trac/ghc/wiki/LinearTypes
Тем временем, кому сильно надо, научились реализовывать их средствами хаскеля:
https://stackoverflow.com/questions/34227536/is-there-a-way-to-emulate-linear-types-in-haskell
Пикрил - выдержка, где видно конкретное использование этой реализации.
Оче прилично ящитаю, никакие стрёмные кишки наружу не торчат, как это часто бывает с велосипедами.
Идрис то хороший язык, но у хаскеля больше и фич (других, кроме линейных типов) и батареек, и так далее.
Впрочем, не вижу проблем чтобы итт обсуждать параллельно всякие идрисы с агдами, пюрскрипты, и прочие любительские диалекты хаскеля.
>>14134 #>>14187 #>>14208 #
Аноним
>>14104 #
Нахера вообще он нужен, этот ваш хаскель? Это чисто игрушка для ума? Что на нем делать лучше чем на нормальных языках?
>>14133 #
Аноним
Василий, голубчик, спустите вот этого охломона >>14127 # с лестницы, будьте добры.
Аноним
GYdIqSnWaDsEx22 KB753x283Screenshot_20190216_010627.png
>>14127
Всё. Даже для запущенных случаев вроде жосткого риалтайма, можно при желании выжать производительность и подобрать подход с минимальным оверхедом на ленивость, сборку мусора, боксинг и так далее. В данный момент задумываюсь над написанием сетевого шутера в жанре Battle Royale на хаскеле. С Ecstasy или Apecs всё летает, Frag был недоразумением.
>>14134 #
Что сказать-то хотел? Ошибка будет статическая, это не какие-то динамические проверки в монаде.
Полное линейное лямбда-исчисление с линейными типами вот:
http://functorial.com/Embedding-a-Full-Linear-Lambda-Calculus-in-Haskell/linearlam.pdf
Я специально в том посте что-то простое и прикладное подбирал.
>>14142 #>>14182 #>>14258 #
Аноним
>>14136 #
Что-то я, погуглив, знатно охуел с этих результатов, ведь все остальные усы - на русте. Как это вообще возможно что такой язык как хаскель оказался по производительности в нескольких случаях немного медленее, а в одном даже немного быстрее, чем решения на байтоёбском языке с ручным управлением памятью?
>>14156 #
Аноним
>>14142 #
Ебать ты долбаёб, братишка, на графике засекали время отработки мейнлупа, а хачкель в играх тормозит из-за гц фризов. Если бы там собрали средний фпс за минуту, было бы намного интереснее, в таком виде тупа ниачём, ведь аллокация объектов без их освобождения (мейнлуп хачкиля) - это быстрее чем аллокация и освобождение (мейнлуп руста, где всякие локальные структурки и вектора выпилились со стека/кучи сразу после выхода из области видимости аля RAII).
>>14183 #>>14184 #
Аноним
>>14136 #
Если ты настолько долбоёб, что считаешь, что линейные типы нужны только для управления внешними ресурсами, и что для линейных типов нужна аж свободная монада, то непонятно, что ты вообще делаешь в разделе о программировании.
Аноним
>>14156 #
С -O2 собирать свои рогалики не пробовал?
Аноним
>>14156 #
Если использовать гц через жопу, то на любом языке профилирование будет интересным. В этих твоих играх со фризами еще, поди, стандартную прелюдию юзали?
>>14185 #
Аноним
>>14182
Во-первых, в статье по ссылке не используются свободные монады, во-вторых, память - это "внешний ресурс"? А я её упоминал выше. Приведи лучше ещё кейсов для линейных типов кроме ресурсов и ручного управления памятью, либо, если тебе больше нравятся такие термины, примеры ресурсов кроме памяти и IO типа файлов и коннекшнов.
>>14184 #
А есть какая-то прелюдия не требующая сборки мусора?
>>14186 #
Аноним
>>14185 #
> Во-первых, в статье по ссылке не используются свободные монады
Какой статье? Не было никакой статьи. Где ты в >>14120 статью увидел?
> А я её упоминал выше.
Анус ты свой упоминал. Перечитай свой пост, что ли.
>>14185 #
А там было что-то про прелюдии без сборки мусора?
Аноним
>>14120 #
> Идрис то хороший язык, но у хаскеля больше и фич
Ололо...
> и батареек
Это вот да. А у Питона так вообще...
Аноним
>>14186
> Какой статье?
Наркоман, перечитай пост на который отвечал в этот раз:
>>14136
> http://functorial.com/Embedding-a-Full-Linear-Lambda-Calculus-in-Haskell/linearlam.pdf

> Анус ты свой упоминал. Перечитай свой пост, что ли.
Ну ты пиздец чокнутый внатуре же. Перечитай более ранний >>14120, который ты сам же и упомянул только что, самое начало.
Видимо на этой борде так мало людей, что местные аноны одичавшие, и не могут удерживать в голове нить дискуссии длиной более чем в 1 пост.

> А там было что-то про прелюдии без сборки мусора?
Твой вопрос подразумевает некую связь между использованием стандартной прелюдии и фризами.
А единственная возможная причина фризов - это захлёбывание сборщика мусора.

>>14189 #
Я сижу через тор браузер, все куки и прочее вычищаются при закрытии браузера, каждый раз ставить этот флажок надо ещё привыкнуть.
>>14193 #
Аноним
>>14192 #
>Я сижу через тор браузер
А умрешь от рака, как ни странно.
>>14199 #
Аноним
>>14193 #
Как бы там ни было, это не повод не использовать тор браузер.
Аноним
>>14120 #
И тут ты такой показываешь сгенерированный асм, в котором структуры линейного типа апдейтятся inplace.
>>14209 #
Аноним
>>14208 #
Тебе надо - ты и пиздуй читать выхлоп кодогенератора, заодно и нам расскажешь, интересно ведь. В целом, раз до тебя до сих пор не дошло: когда тебе нужна охуеть какая производительность, ты будешь использовать решения вроде ECS, где никаких структур вообще нахуй нет, ведь всё разложено по массивам, да ещё в специальной преалоцированной памяти, которую сборщик не трогает, потому что она живёт бесконечно, а управляется, расширяется и подчищается, самим движком ECS.
>>14210 #
Аноним
>>14209 #
То есть, нормальной производительности от этого вашего Хачкеля не добиться. Так и запишем.
>>14211 #
Аноним
>>14210 #
> тролинг тупостью
Я понимаю, что сам по себе нультиреч - это уже историческая реконструкция сама по себе, но это было старо даже 10 лет назад, так что не жди что кто-то будет тебе что-то объяснять и доказывать пока ты не покажешь что конкретно ты уже попробовал и что хотел бы улучшить. Покажи свою проблему на самодостаточном примере, который мы сможем запустить, и тогда мы подумаем, как сделать это быстрее.
>>14212 #
Аноним
>>14211 #
Обосрался - обзови оппонента тупым.

updateInplace :: Int -> a -> Vector a -> Vector a
>>14214 #
Аноним
>>14208
>>14212 #
Опиши примерно, в чём ты видишь проблему. Я на своём хаскельном компьютере сидел на убунту на атоме, но сейчас всё же решился превозмочь, так что занят изучением и кастомизацией вима на генту. Потом можно будет потыкать твой пример. Но в целом не вижу никаких ограничений. В примере с Bake все права закодированы в GADT, updateInplace - это будет кейз уровня Keep который там есть для примера.
>>14215 #>>14219 #
Аноним
>>14214 #
В твоем примере с Bake вообще навелосипеженная Free. Но да хуй с ней с терминологией.
> все права закодированы
> права
А можно мне уже что-нибудь *кроме* типодроча посмотреть? Например, обновление без копирования на выходе компилятора, как в сишечке? Можно? Или для реальных приложений опять нужно пердолиться с апексом?
>>14216 #
Аноним
>>14216
> IO/ST там, где оно нахуй не упало
> Array вместо б-жественного Vector
Анон, если ты считаешь, что, прочитав учебник по Хачки, ты можешь вести дискуссию о сортах чистоты и uniqueness типов наравне с >>14214 #, то ты ошибаешься.
Аноним
Ой блять, идите нахуй со своим нульчаном. Если вы десять лет назад не осиливали ничего лучше чем тролинг тупостью с запутыванием "дискуссий" якобы неумением посты не то что понимать, но даже читать, и обрывками копипаст с усиленными попытками сделать вид, что что-то понимаете в хачкеле, то сейчас вы уже пенсионеры-неосиляторы, лучше со школьниками общаться.
Аноним
Таких долбоёбов, как второй постер из двух которые есть в этом треде (включая меня), можно было бы терпеть, если бы это было, ну, 10% от всего чужого постинга, но не больше.
Аноним
> Тред %language_name%
Сосачер, плиз.
Аноним
>>14104 #
> Тред великого и могущественного языка ленивого теоретико-категорного функционального метапрограммирования.
> обсуждают какой-то Haskell
Аноним
>>14258 #
LiquidHaskell добавляет много всякой хуйни для выражения своего мазохизма и дисциплины, но ничего не добавляет для выражения своих идей. Иными словами, там нет каких-то ништяков такого же уровня как алгебраические типы или классы типов, там ништяки уровня ассершнов на тайплевеле. Это круто, но мне нужен язык чтобы баловаться, экспериментировать, раскладывать свои мысли по полочкам, делать из этого выводы и получать вдохновение и новые более фундаментальные интуиции. Если в хаскеле не утопать глубоко в сомнительные изъёбы на тайплевеле, он очень хорошо подходит для этих целей. На скриптах ты всё быстро напишешь на отъебись, оно будет работать, но ты толком можешь и не понять что ты вообще делаешь. Хаскель может помочь лучше понять процессы которые ты реализовываешь, увидеть за ними что-то более общее, и он даже заставит тебя осознать что является контекстом чего, и такое прочее.
>>14307 #>>14312 #
Аноним
>>14300 #
> LiquidHaskell добавляет много всякой хуйни для выражения своего мазохизма и дисциплины, но ничего не добавляет для выражения своих идей. Иными словами, там нет каких-то ништяков такого же уровня как алгебраические типы или классы типов, там ништяки уровня ассершнов на тайплевеле.
Пиздец у тебя каша в голове.
>>14308 #
Аноним
>>14307 #
Торч-рнн, плиз.
Аноним
>>14258 #
Жидкие хачкели и прочие ассершны на SAT-солверах в прикладных задачах являются дрочью страдающей от diminishing returns. Если речь о написании софта, а не доказательстве теорем, даже наворачивать GADT со всякими фантомными тегами - это уже перебор в большинстве случаев. Надо проще быть. Функции + АДТ + паттерн-матчинг + самые базовые тайпклассы + всякие синтаксические мелочи - наше всё. Хаскель на рекомендуемых настройках - это хороший баланс между продуктивностью и безопасностью. Хаскель на максималках - это то, что может потребоваться где-то в недрах библиотек, но по возможности не должно вылазить за их рамки.
Аноним
>>14300 #
> хаскель
> хорошо подходит для баловаться и экспериментировать
Братюнь, любой вариант зависимых типов заведомо выразительнее предикативного огрызка системы F. Даже страуструповая типизация выразительнее (вариант C++20 - так уж точно). У тебя синдром утёнка, что ли?
Аноним
GYdIqSnWaDsEx12 KB474x353newtype.jpg
Аноньчики, каждый раз когда у вас возникает соблазн покушать деструктивной меты или ответить на вырванную из контекста токсичную копипасту, потратьте эти силы на то, чтобы проигнорировать и написать какой-то новый конструктивный пост, или хотя бы поделиться интересной ссылкой.
>>14380 #>>14387 #
Аноним
>>14400 #
а, я думал, это какой-то новый синтаксис
Аноним
Поясните ньюфагу, что делает -XPolyKinds?
>>14420 #
Аноним
>>14416 #
Полиморфные кайнды. Например, без этого ты можешь делать
data Yoba (t :: *) ... where ...
t - тип
или
data Yoba (s :: State) ... where ...
s - датакайнд полученный промоушном из адт State
А с PolyKinds можно делать ещё и
data Yoba (s :: k) ... where ...
и s будет кайнда k, где k может быть как типом (*), так и конструктором типа (* -> *),
так и любым датакайндом вроде State выше
>>14421 #
Аноним
>>14420 #
> t - тип
t - это переменная типа
> s - датакайнд полученный промоушном из адт State
точнее, s - это переменная кайнда полученная промоушном из адт State
а кайнды полученные промоушеном из адт называют датакайндами
то есть s, строго говоря, не переменная типа, потому что у переменных типа кайнд *
>>14422 #
Аноним
>>14421 #
>точнее, s - это переменная кайнда полученная промоушном из адт State
*полученного
Аноним
>>14575 #
Почему stack, а не старый добрый cabal?
Аноним
>>14104 #
Потому что хочется иметь свой тулчейн и либы под каждый проект отдельно, а не держать в общей куче и охуевать от депендеси хелл, когда требуемые пакеты никак нельзя установить потому что они конфликтуют с теми что уже установлены и используются в других проектах. Cabal sandbox частично решает, но stack лучше. В отличие от первого, второй умеет разные версии ghc под разные проекты (причём он не будет заново качать и билдить одну и ту же версию ghc, если она уже где-то используется), плюс умеет расшаривать скачанные исходники пакетов между проектами (но билдится они будут заново в новом контексте), плюс резолверы и stackage.
Аноним
Аноним
GYdIqSnWaDsEx155 KB1920x10472019-02-23-054029_1920x1047_scrot.png
>>14610 #
Неплохо, в VS Code очень популярно расширение превращающее его в Vim в плане редактиррования, надо попробовать.
А я себе ещё покруче лук заебашил, для счастья не хватает только тёмной темы документации, пока хуй знает как зделать.
Аноним
>>14610 #
Emacs умеет всё то же самое, только скрипты в нём не перлоподобные.
>>14613 #
Аноним
>>14612 #
Да любой программируемый редактор умеет всё что угодно. Вопрос в удобстве и скорости автоматизации. Вим примечателен гранулярностью и композабельностью комманд, в имаксе другой подход. В виме философия "мы имеем большой набор атомарных комманд которые хорошо комбинируются друг с другом, реализация новых комманд делается только в самом крайнем случае", в имаксе философия "с нуля нихуя нет, но зато есть лишп, он такой гибкий, что всё можнозделать". В результате чего в имаксе комманды самостоятльные большие и монолитные, делают много сразу. Но для илиты один хуй есть evil-mode, так что похуй, можно и имакс.
Аноним
GYdIqSnWaDsEx17 KB616x102timesRandom.png
Написал себе вспомогательную функцию для повторного применения случайной генерации n раз.
Например,
$ timesRandom 10 (randomR (1, 10)) (mkStdGen 1234)
([6,2,10,2,3,2,7,2,6,8],522754180 1336516156)

Кто-нибудь знает как сформулировать timesRandom стандартными средствами?
Чуйка подсказывает что как-то можно через Control.Monad.
Первое что пришло в голову - unfold, но там сига
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
А мне g тоже нужен в конечном результате...
>>14648 #
Аноним
GYdIqSnWaDsEx91 KB1057x612timesRandom'.png
>>14645 #
Чёт тупанул, это ж классическая стейт монада. Элементарщина.
Давно монад не нюхал, совсем форму потерял...
>>14872 #
Аноним
Пока вы иам свои монадки собираете, у вас в GHC в Runtime System в динамическом загрузчике сидит UB в интерпретаторе байткода для какого-то стекового говна https://govnokod.ru/25399
>>14680 #
Аноним
>>14676 #
Я ничего не понял, но тред интересный. Алсо, не знал что в хаскеле есть динамическая линковка.
Алсо, насколько я понял, это код загружает байткоды из файла?
Если так, то насколько я помню, хранить данные в файлах без выравнивания под машинные слова - нормальная практика, обычная экономия дискового места.
>>14694 #>>14712 #
Аноним
>>14680 #
https://wandbox.org/permlink/V4OUcZuqJwIan045 вот тебе сама суть ошибки. Нельзя писать и читать uint16_t по невыровненному адресу. А там push-ы эти могут невыровненно делаться, т.е. если сначала адрес был кратен двум, то если один раз push-нуть 1 байт, а потом один раз пушнуть 2 байта, произойдет невыровненная запись. По стандарту C это UB.
>>14700 #
Аноним
>>14694 #
А, понятно. Скорее всего там банально отдельные инструкции под выравнивание:
https://github.com/ghc/ghc/blob/e204431e5a5e2fd16da52b04bda2798f16c51344/rts/Interpreter.c#L1358
Думаю, не бывает такого что за инструкцией PUSH8 идёт сразу PUSH16, между ними ещё при компиляции байткода будет вставлена как минимум bci_PUSH_PAD8.
Но это чисто гипотеза.
Аноним
GYdIqSnWaDsEx120 KB621x797shuffle'.png
Начинаю потихоньку шквариться об ST. Написал два варианта функции перемешивания массива. Заодно вспомнил, почему мутабельные массивы в стандартной библиотеке - неюзабельное говно (чтобы сделать new надо подключать ScopedTypeVariables и шкварить ими сигнатуру). По дороге узнал, что в хачкель оказывается уже завезли расширение https://ghc.haskell.org/trac/ghc/wiki/TypeApplication, но дефолтные массивы настолько ужасны что им это не помогает.
>>14873 #
Аноним
>>14680 #
>Алсо, насколько я понял, это код загружает байткоды из файла?
Этот код - интерпретатор байткода для GHCi. Т.е. GHCi, как я понял, генерит вот такой вот байткод и потом его интерпретирует.
См. https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/Backends/GHCi
И для загрузки динамических библиотек хаскеля этот интерпретатор как-то используется, судя по всему.
> Думаю, не бывает такого что за инструкцией PUSH8 идёт сразу PUSH16, между ними ещё при компиляции байткода будет вставлена как минимум bci_PUSH_PAD8.
Если я всё правильно понимаю, в динамических библиотеках Хаскеля может содержаться такой вот байткод, и никакой предварительной валидации он не проходит перед загрузкой. Т.е. даже если хаскелевый компилятор-в-байткод всегда генеритует нужные паддинги, можно на это наплевать, сделав файл без этих оподов для паддингов вручную, например в 16-ричном редакторе.
>>14716 #
Аноним
>>14712 #
> Т.е. даже если хаскелевый компилятор-в-байткод всегда генеритует нужные паддинги, можно на это наплевать, сделав файл без этих оподов для паддингов вручную, например в 16-ричном редакторе.
Ну такое... Ещё можно нерабочий экзешник в блокноте накидать. А ещё он наверное не валидирует когда с пустого стека пытаются что-то снять. И так далее.
>>14729 #>>14730 #
Аноним
>>14716 #
>Ну такое... Ещё можно нерабочий экзешник в блокноте накидать.
Это глупо сопоставлять. Если у тебя есть например какой-нибудь просмотрщик JPEG картинок, и можно набайтоебить в HEX-редакторе какой-то невалидный JPEG файл, от которого твой просмотрщик картинок глючит, то это проблема именно просмотрщика картинок.
Аноним
>>14716 #
https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.10 почитай вот про верификацию байткода Java.
Link-time verification enhances the performance of the run-time interpreter. Expensive checks that would otherwise have to be performed to verify constraints at run time for each interpreted instruction can be eliminated. >The Java Virtual Machine can assume that these checks have already been performed. For example, the Java Virtual Machine will already know the following:
>* There are no operand stack overflows or underflows.
>* All local variable uses and stores are valid.
>* The arguments to all the Java Virtual Machine instructions are of valid types.
>>14733 #
Аноним
>>14729
>>14730 #
Это, конечно, круто, но в джаве это намного важнее в первую очередь потому, что там байткод - конечный продукт.
В хаскеле ghci и его байткод используется только для разработки, после нормальной компиляции его не будет.
Но в целом, это отличная тема для статьи или диссертации, думаю когда кто-то заметит, эту тему обязательно поэксплуатируют.
>>14736 #
Аноним
Аноним
>>14733 #
> Но в целом, это отличная тема для статьи или диссертации, думаю когда кто-то заметит, эту тему обязательно поэксплуатируют.
В любом случае, для самого проекта GHC даже просто рефакторинг стрёмной хуйни - это важно и полезно.
Не всё то что невидимо для конечного пользователя является ненужным.
Аноним
>>14648 #
Все нормальные люди давно пердолят случайности внутри RVar.
Аноним
>>14704 #
Все нормальные люди используют vector.
Аноним
>>14857 #
ПРИШЛО ВРЕМЯ ПИСАТЬ БИБЛИОТЕКУ ДЛЯ СВГ-ГРАФИКИ
БИБЛИОТЕКА ДЛЯ СВГ-ГРАФИКИ САМА СЕБЯ НЕ НАПИШЕТ

Тут анон в соседнем треде горы рисовал. Без всяких diagrams...
>>14876 #
Аноним
GYdIqSnWaDsEx39 KB780x572split_rng.png
>>14872
А там можно будет засплитить генератор на два, потом многократно поюзать каждый из них а пото продолжить в обычном режиме с одним из них? (пикрил)
>>14875 #
Ой, блять, лишь бы шото погавкать.
Diagrams уже давно написана, она удобная, проста для использования, и в ней есть много приятных вещей вроде рейтрейсинга.
https://archives.haskell.org/projects.haskell.org/diagrams/doc/manual.html#traces
>>14882 #>>14883 #
Аноним
>>14876 #
> А там можно будет засплитить генератор на два, потом многократно поюзать каждый из них а пото продолжить в обычном режиме с одним из них?
Внутри RVar ты просто пользуешься генератором, его созданием, сплитованием, закрытием и прочим мейнтейном занимается внешний по отношению к монаде код.
>>14884 #>>14888 #
Аноним
>>14876 #
> %library_name% уже давно написана, она удобная, проста для использования, и в ней есть много приятных вещей вроде рейтрейсинга.
Но ВРЕМЯ все равно ПРИШЛО...
Аноним
>>14882 #
s/его созданием/а его созданием/
Аноним
>>14882 #
Короче, это очередной MonadRandom, изоморфный стейт монаде, где стейт - RandomGen. То есть в рамках одного монадического вычисления RVar мне доступен только один генератор. А мне в данном случае надо два. В обычной стейт-монаде я могу в стейт положить тупл из двух RandomGen, а в коде без монад это просто два параметра функции вместо одного.
>>14889 #
Аноним
>>14888 #
На гитхабе вижу хороший пример юзания этого во внешней монаде:
https://github.com/mokus0/random-fu#usage
Но это имеет смысл только если работаешь в IO или ST, удобнее чем самому городить IORef или STRef с RandomGen.
>>14900 #
Аноним
>>14889 #
Да, отделение генерации случайных чисел от работы с генератором.
Аноним
GYdIqSnWaDsEx31 KB800x800hui_6696739761682795801.png
>>14979 #
В CorelDraw каждый раз надо с нуля рисовать, нет рандомизации. На ЯП один раз программку написал и оно тебе бесконечно годноты генерирует.
Аноним
>>14974 #
Серьги из фанеры? Ты серьезно?
Аноним
>>14985
В >>14974 # не нужно было ничего рандомизировать. А так да.
Аноним
GYdIqSnWaDsEx1.3 MB1693x1003cA.png
Клеточные автоматы - крутая тема, с маленьким множеством состояний и рандомными правилами это скучновато и слишком абстрактно, но я уже предвкушаю как на этом можно зделать генерацию карт, с естественно образующимися и развивающимися биомами, а в 3д случае в них даже тривильно зашивается гравитация (если взять такое "соседство" в котором разрешается смотреть в свою собственную клетку, то если своя пустая а сверху полная, значит своя станет той что сверху, аналогично если своя полная а снизу пустая, то своя становится либо пустой если сверху пустая, либо такой как сверху если та полная).
>>15026 #
Аноним
>>15026 #
А теперь вкратце опиши, что ты наворотил. В твоем выдранном куске говнокода только Господь Бог и разберется. У меня УМЕНИЕ РАЗБИРАТЬСЯ В ЧУЖОМ КОДЕ от тебя.
Аноним
>>15026 #
Пиздец дристня. Еще и в виде картинки, ЛАЛ!
>>15042 #
Аноним
>>15029
>>15041 #
2д клеточный автомат со случайным набором правил. Можно поставить на ночь генерировать хуйни а потом смотря на картинки, выбирать такие где произошла СХОДИМОСТЬ и выдирать их seed, подставлять обратно в генератор и забирать набор правил для подзалупного изучения. Ну так-то это чисто хелловорлд в данной теме, теперь думаю вынести "соседство" параметром и посмотреть что будет если кроме разглядывания 4х смежных клеток, принимать решение на основе ещё и самой себя, потом можно попробовать добавить диагонали, потом наконец-то придумать правила самому а не рандомом. Например, для простейшей симуляции жидкости, по идее может получиться несложно но эффектно. Надо ещё сделать чтобы сразу гифку генерировало.
>>15045 #
Аноним
>>15042 #
Блять, я пытался распаралелить эту хуйню, оно поработало минут 15, а потом винда ушла в чёрный экран, хорошо что в лайв режиме сообщение не теряется. Скорее всего оно выжырает миллионы памяти из-за того что я делаю iterate и он не сумел понять что предыдущие результаты уже не нужны. Зато за эти 15 минут пока я завтракал оно мне нагенерировало 1856 изображений.
>>15046 #
Аноним
>>15046 #
В винде в коде вместо \\ ты можешь писать /
Аноним
Как в этом вашем Хачкеле задать тип целых чисел от 0 до 100?
>>15054 #
Аноним
GYdIqSnWaDsEx166 KB2666x922plines_ca.png
>>14104
Сука лол, я поменял ОДНУ строку
import qualified Data.Vector as V
на
import qualified Data.Vector.Unboxed as V
и теперь потребление памяти выше 100мб не поднимается.
Алсо, наконец-то обнаружен интересный набор правил при которых оранжевое говно за 10к итераций сьедает всю зелёнку и выстраивается в околопараллельные линии.
>>15053 #
На обычном хачкеле можно, но лучше не надо.
Если тебе надо неиронично маняврировать такими ограничениями на тайплевеле, лучше сразу бери LiquidHaskell.
>>15076 #>>15055 #
Аноним
>>15054 #
> Сука лол, я поменял ОДНУ строку
> import qualified Data.Vector as V
> на
> import qualified Data.Vector.Unboxed as V
Ты раньше на PHP писал? Или на Питоне?
>>15056 #
Аноним
>>15055 #
Судя по вопросу, ты вообще никогда ни на чём не писал.
>>15057 #
Аноним
>>15056 #
Слив защитан.

Обычно пыхоёбы не умеют подбирать структуры данных вообще. И гордятся, когда таки подбирают правильные, как будто совершили научное открытие на нобелевскую премию.
>>15058 #
Аноним
>>15057 #
Вообще-то вектор в котором лежат числа и вектор в котором лежат указатели на числа в куче - это одна и та же структура данных.
Очевидно, такая разница в данном случае получилась за счёт того, что для анбоксинга приходится быть энергичным и в клетках не накапливаются санки с отложенными вычислениями.
>>15059 #
Аноним
>>15058 #
> Обычно пыхоёбы... гордятся, когда таки подбирают правильные, как будто совершили научное открытие на нобелевскую премию.
>>15064 #
Аноним
>>15059 #
>слив
Съеби на свой родной сосач, уёбок
>>15069 #
Аноним
>>15064 #
Сосачеребёнок посылает на сосач, как мило!

Золотце защитывал сливы сначала на Нульчане, а потом уже к вам переметнулся. Такие дела.
Аноним
GYdIqSnWaDsEx18 KB800x800cellular_n_4911703518825861715_10000.png
>>15057
>>15059
Зачем мне гордиться какой-то утилитарной мелочью, деталью реализации, когда у меня есть клеточные автоматы, которые строят лабиринты? Плохая нейроночка, неправильно классифицируешь эмоции. >>15054 # это удивление и радость от того, что практически нихуя не пришлось делать, а всё заработало более чем удовлетворительным образом. Никакого байтоёбства, никакие выхлопы и промежуточные представления, обошлось даже без SCC.
>>15078 #>>15077 #
Аноним
>>15076 #
Автомат с полем в 3,5x3,5 даже у пыхобляди заработает.
>>15079 #
Аноним
>>15076 #
> SCC
штоэтаааа?
Аноним
>>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 потоков, чтобы занять все ядра полезной работой и максимизировать скорость.
Аноним
GYdIqSnWaDs4.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 #
Аноним
Соседство наркоманское - фон Неймановское с вычеркнутой своей клеткой. Не знаю почему именно такая дрянь - первое что мне пришло в голову.
Я сейчас буду делать жидкость с самописными правилами, не представляю как такое вообще можно реализовать без рассмотрения своей клетки.
Аноним
>>15112
> не представляю как такое вообще можно реализовать без рассмотрения своей клетки.
И конечно же я не буду пытаться так изъёбываться, я просто сделаю функцию соседства параметром, но не фунаргом, а зашью в адт кейсы, потому что хочу иметь Show и сохранять название функции соседства в имя сгенерированных файлов, чтобы потом можно было весь процесс реконструировать, как я реконструировал правила просто взяв seed из имени >>15094 #.
Аноним
>>15111 #
А твоё что-то не получается воспроизвести.
>>15199 #
Аноним
>>15132
>>15136
>>15138
Не запускаются эти видео в mp4 к сожалению.
>>15157
Вот это работает.
>>15141 #
Если что, там перечислены клетки в порядке [верх, низ, лево, право]. Своя клетка для принятия решения вообще не используется, в отличии от автомата жизнь. Я думаю что порядок имеет значение, автомат и его правила можно поворачивать на 90 градусов и некоторые варианты симметричны, другие нет. Думаю что [верх, низ, лево, право] будет вести себя так же как повернутый [лево, право, верх, низ], но вот [верх, лево, право, низ] будет вести себя совершенно иначе.
>>15254 #
Аноним
>>15138 #
Залей в webm плиз, интересно посмотреть. В mp4 у меня оно не запускается даже через сохранение на диск.
>>15204 #
Аноним
>>15199
>>15200 #
Эти видео я смог запустить через potplayer.
Аноним
>>15204
У меня получилось через mpchc, >>15138 # красивый случай, сколько нагенерировал прежде чем на него наткнулся?
>>15211 #
Аноним
>>15207
>>15208
>>15209 #
Кайф.
Аноним
>>15211 #
Во всех этих случаях у тебя правила рассматривают 5 клеток (включая свою)?
>>15215 #
Аноним
>>15215 #
Если интересно, попробуй ещё 5 и 9 (с диагоналями).
Мне кажется там могут легко всякие биологически-химико-физические паттерны проскакивать.
Аноним
Аноним
>>15220 #
Не знаю, мне кажется что со случайным полем больше всего интересностей. Можно попробовать тупо пополам делить.
Аноним
GYdIqSnWaDs01:402.4 MB200x2001.webm
>>15199 #
Не получается, короче.

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

В классификации https://en.wikipedia.org/wiki/Cellular_automaton#Classification это всё классы 2-4.
>>15432 #>>15437 #
Аноним
>>15343 #
Правила в известных автоматах очень симметричные. В "Жизни" так вообще рассматриваются количества живых и мертвых клеток.
>>15443 #
Аноним
GYdIqSnWaDs2.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 #
> весьма популярный
Аноним
GYdIqSnWaDsEx70 KB835x841better_validation.png
Придумал как прокачать валидацию. Теперь валидаторы не только для сопоставления двух итераций, но и просто для проверок в рамках одной итерации.
Аноним
GYdIqSnWaDs6.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 #
Аноним
GYdIqSnWaDsEx30 KB894x500gif_rendering.png
>>15655 #
Это как-то совсем избыточно. Сейчас напрямую из анбоксед вектора делается гифка, вряд ли это можно ускорить при помощи добавления промежуточной текстуры. JuicyPixels - это чисто библиотека для работы с форматами изображений, у неё нет своего рисования, которое могло бы тормозить, как в случае с diagrams. Пикрил можно немного ускорить заменив два M.! на что-то получше. Как минимум второй M.! можно заменить на V.!, если занумеровать пространство состояний интами. Но в автоматах итт эти лукапы и так очень дешевые, потому что размеры этих мапов не больше 5 элементов.
>>15721 #
Аноним
GYdIqSnWaDs2.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 #
Аноним
>>15984 #
Индустриальные господа предпочитают заниматься серьезными делами, а не кодингом на хакатонах.
Аноним
>>15984 #
В рестораны ходят провинциальные мажоры, индустриальные господа греют замороженные продукты в промышленной микроволновке на 10 киловатт.
>>15994 #
Аноним
>>15988 #
Или жарят их, пиздя ладонью, разогнанной до 5996.34 км/ч.
>>16006 #
Аноним
>>15984
>>15985
>>15988
>>15994 #
Индустриальные господа пьют сойлент во время пробежки вокруг своей фермы асиков, работающей на солнечных батареях.
>>16067 #
Аноним
>>16006 #
>Индустриальные господа
>солнечных батареях
Лол, ты что-то попутала, зеленая маня. Индустриальные господа пользуются исключительно ядерной энергией.
Аноним
>>16330 #
Код кидай! Или не хочешь позориться?
>>16340 #
Аноним
GYdIqSnWaDsEx37 KB859x596discrete-rules.png
>>16338 #
Это всё те же целиком рандомные автоматы что и в начале (пикрил).
Я придумал рандом поинтереснее, но еще не дописал.
>>16342 #>>16381 #
Аноним
>>16340 #
А почему постишь код в таком уебанском виде? Чем старый-добрый текст не устроил?
>>16343 #
Аноним
>>16342 #
Видимо он не в курсе о подсветке синтаксиса здесь.

newtype State = State Int deriving (Show, Eq, Ord)

derivingUnbox "State"
[tI State -> Int I]
[I \(State x) -> x I]
[I \x -> State x I]

type Rules = V.Vector State

applyRules :: Int -> Rules -> [State] State
applyRules numStates rules nh = rules V.! index where index = L.foldl' (\a s -> a * numStates + coerce s) 0 nh
randomRules (MonadRandom m) => Neighbourhood c State -> Int -> m Rules
randomRules nh numStates = V.fromList <$> replicateM numNeighbourhoods (randomElem states)
where
numNeighbourhoods = product $ replicate (nhSize nh) numStates
states = coerce [0 .. numStates - 1]

randomAutomaton (MonadRandom m) => Neighbourhood c State -> Int -> m (Automaton State)
randomAutomaton nh numStates = do
rules <- randomRules nh numStates
return $ CA.build nh $ \cells -> applyRules numStates rules (nhToList nh cells)

randomGrid (MonadRandom m) => Int -> Int -> m (G.Grid State)
randomGrid gridSize numStates = G.randomGrid' gridSize (coerce [0 .. numStates - 1]) (State 0)

randomStateColors (MonadRandom m) => Int -> m (M.Map State RgbTuple)
randomStateColors numStates = do
let states = coerce [0 .. numStates - 1]
colors <- replicateM numStates randomColor
return $ M.fromList $ zip states colors
>>16344 #>>16345 #
Аноним
>>16343 #
Хотя подсветка хачкель похоже не понимает.
Аноним
>>16343 #
Упс, распознавалка проебала часть символов.
Аноним
>>16340 #
Откуда про coerce вычитал? Только не говори, что перечитал все хачкемодули и между делом нашел Data.Coerce.
Аноним
>>16630 #
как тебя припекло-то ахаха
Аноним
>>16879 #
>учат в школе
В школе не учат, а колечат детей
Аноним
>>16879 #
ты что дебил?
Аноним
Поссал на очкопетухаскель.
Аноним
Нашёл книжку за функциональное программирование из 1993, там Hope. Поясните за Hope штоле, а то в книжке меня там собираются вроде как алгоритмам учить и безболезненно. Вдруг криворукий мудак (я) что поймёт?

Трогал в основном схемку и совсем чуть-чуть хаскеля.

>>26592 #
Аноним
>>26518 #
я в школе на нем калькулятор писал. сейчас уже не напишу.
Аноним
>>26515 #
Hominem unius libri timeo.
Rozen Maiden
>>26652 #
Заебал с розовой пидараснёй срать и форсить это вайфолку.

НазадКаталогВверхПоследние 100