М.Двач / Программирование

Двач.hk не отвечает.
Вы видите копию треда, сохраненную 12 ноября 2018 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

16 Кб, 222x294
Maybe Haskell-тред #6 /haskell/ 17 окт 2017, 19:51 1077271 В конец треда | Веб

Basics - http://learnyouahaskell.com/chapters
Medium - http://book.realworldhaskell.org/read | https://www.goodreads.com/book/show/25587599-haskell-programming
Concurrency - http://chimera.labs.oreilly.com/books/1230000000929/index.html
Web - http://www.yesodweb.com/book

ХеллоуУорлды в монады оборачивать здесь -> https://www.codewars.com

Ответы077377095138109455163171172619223253248306248569253997258065

17 окт 2017, 19:53 2 1077273

>>1077220
Перфоманс хаскеля трудно измерить в принцпие из-за встроенной ленивости, он может по скорости в догонять языки без GC, а может взять в рот и питухона.
В принципе это есть один из реальных недостатков хаскеля

Ответы109457

17 окт 2017, 20:27 3 1077283

Спалите небольших проектов (или больших, но разбитых на множество небольших) на хаскеле, по которым можно хорошенько разобрать язык. Что-то типа https://github.com/uutils/coreutils.

Ответы077284077289

17 окт 2017, 20:27 4 1077284

>>1077283
https://github.com/uutils/coreutils
fix

17 окт 2017, 20:32 5 1077289

>>1077283
https://github.com/jystic/hadoop-tools/tree/master/hadoop-tools
Ну вот неплохой пример. Хотя не знаю что там спаливать. Программа на хаскеле это цепочка функций, которая внезапно, обрабатывает данные.
Вот и весь секрет. Остальное собсно твой скилл кодинга, алгоритмов, умение создавать композиции, которые, в принципе - оторваны от парадигмы

Ответы077293260985

17 окт 2017, 20:37 6 1077291

>>1077214
С такими вопросами в ПХП/Java тред.

17 окт 2017, 20:39 7 1077293

>>1077289
Спасибо, я знаю, я лиспер.
Просто по такому коду быстро въезжаешь в язык, удобно. Если взять сразу какой-нибудь pandoc, то неделю потратишь только на то, чтобы понять связи между частями проекта (образно говоря), вместо того, чтобы учиться на кусочках кода.

17 окт 2017, 21:23 8 1077318

ДВА ХАСКЕЛЛОТРЕДА НА НУЛЕВОЙ!

17 окт 2017, 23:15 9 1077377

>>1077271 (OP)
>Maybe Haskell-тред
Nothing

18 окт 2017, 05:09 10 1077467

Как будете оправдываться за эту шишню, хачкелисты?
http://honza.ca/2012/10/haskell-strings

Ответы077670078595078839079166082998086816095511

18 окт 2017, 16:08 11 1077670

>>1077467
> This clocks in at 3.5s on my machine. Pretty fast!

За что оправдываться-то?

Ответы078605

20 окт 2017, 00:55 12 1078595

>>1077467
Ох и вбросил так вбросил

20 окт 2017, 01:14 13 1078605

>>1077670
ну наверное на то что наивное решение на хаскеле пососало немытых хуйцов в производительности. Но чо поделаешь, язык не сильно под числодрочение и скриптование заточен.

Ответы078807

20 окт 2017, 15:58 14 1078807

>>1078605
> язык не сильно под числодрочение и скриптование заточен
Ага. Так за что оправдываться-то?

20 окт 2017, 17:16 15 1078839

>>1077467
Я правильно понимаю, что он в одной куче сравнивает скомпилированные программы на Го и Сях и интерпретируемые программы на хачкеле, питоне и ноде?

Ответы078977

136 Кб, 808x1080
20 окт 2017, 20:55 16 1078974

The Haskell School of Expression (2000, Cambridge).djvu
Версия с вшитым оглавлением. Теперь это можно читать — http://m.turbobit.net/tj2jrpany0vy.html

Ответы079026089087

20 окт 2017, 21:00 17 1078977

>>1078839
>интерпретируемые программы на хачкеле
Так-так, что тут у нас?

Ответы078995

20 окт 2017, 21:33 18 1078995

>>1078977
>ghc -O2 -o main Main.hs
Я неправильно понял -_-

20 окт 2017, 22:22 19 1079026

>>1078974
Уровень книги, лоу, мид, хай. Если можешь, то развернуто

Ответы079090

21 окт 2017, 00:11 20 1079090

>>1079026
Уровень - введение в хачкель. По ходу изложения автор пилит некий проект. Либы, что в нем используются, уже не актуальны, поэтому практиковать по ходу изложения новичку проблематично. Эту книгу рекомендовали здесь в былые времена.

> Начинай с The Haskell School of Expression дальше читай Typeclassopedia (http://www.haskell.org/wikiupload/8/85/TMR-Issue13.pdf), дальше статьи по ссылкам в тайпклассопедии, викикнигу (http://en.wikibooks.org/wiki/Haskell), а точнее отдельные главы. Ну и вики на haskell.org.
> Некоторые няшечки могут посоветовать Душкина (беги от этой книги, как от чумы), Грема Хаттона или "Изучи себе хаскель во имя великой справедливости" - не слушай их, только напрасно потратишь время.

21 окт 2017, 11:06 21 1079166

>>1077467
> October 24, 2012
Давай ещё раз.

21 окт 2017, 11:07 22 1079167

> Изучи себе хаскель во имя великой справедливости
Вот да, нудновато, многабукав, и волшебно уметь в хаскель не начинаешь.

21 окт 2017, 17:07 23 1079314

Хаскел тред, все в монады

27 окт 2017, 22:47 24 1082972

бамп

27 окт 2017, 23:35 25 1082998

>>1077467
Впервые вижу сколь-либо интересный аргумент за безтиповое программирование, хотя все равно звучит похоже на "нахуй нам ваши типы, мы в болоте посидим"

31 окт 2017, 22:30 26 1085202

Бампецкий

3 ноя 2017, 19:23 27 1086816

>>1077467
Мы дрочим на монады, а не на строки.

4 ноя 2017, 18:05 28 1087177

Какие преимущества у Haskell перед OCaml кроме никому не нужной ленивости и чистоты?

Ответы087210087377095514

4 ноя 2017, 19:33 29 1087210

>>1087177
Тайпклассы поудобнее?
Ну а ленивость и чистота для кого-то — серьезное дело.

5 ноя 2017, 03:45 30 1087377

>>1087177
.+ .* .- ./

5 ноя 2017, 14:15 31 1087479

Я нашел самую полезную библиотеку:
>-- | Safely doesn't perform IO with the help of acme-dont. Side-effects-free!
>safePerformIO :: IO a -> Maybe (IO ())
>safePerformIO = Just . don't
https://hackage.haskell.org/package/acme-safe-0.1.0.0/docs/src/Acme-Safe.html

Ответы087488087501087604

5 ноя 2017, 14:34 32 1087488

>>1087479
10 из 10

5 ноя 2017, 15:06 33 1087501

>>1087479
Проиграл.

5 ноя 2017, 19:19 34 1087604

>>1087479
Почему-то больше проиграл с того, как safeTrace реализована через safePerformIO. Напомнило fizzBuzzEnterpriseEdition.

8 ноя 2017, 10:59 35 1088712

Посоветуйте учебник по хаскеллю на руззком, прошу.

Ответы088715089087089107

8 ноя 2017, 11:02 36 1088715

>>1088712
https://www.ohaskell.guide/
+ ищи русский перевод Learn you a haskell
Это тебе не джава, без английского далеко не уйдешь.

Ответы088716

8 ноя 2017, 11:03 37 1088716

>>1088715
Ниче, прорвемся.
спасибо

9 ноя 2017, 09:17 38 1089087

>>1078974
Зачем выкладывать книги на помойках, если есть либген? (Залил бы туда, но мне лень)

>>1088712
Учебник от Anton K попробуй
https://anton-k.github.io/ru-haskell-book/book/home

9 ноя 2017, 10:04 39 1089101

http://www.seas.upenn.edu/~cis194/spring13/lectures.html
А вот это как? Разбирался в хачкелле кто по этому материалу?

Ответы090304

9 ноя 2017, 10:19 40 1089107

>>1088712
>на руззком
Ох лол, ты уверен что ты правильную сферу деятельности выбрал?

Не читаю на пидарашкенском since 2007

Ответы089349

9 ноя 2017, 16:19 41 1089349

>>1089107
Я ни в чем не уверен в этой жизни.

11 ноя 2017, 15:12 42 1090304

>>1089101
Аппликативные функторы хорошо зделоны.

17 ноя 2017, 14:49 43 1093427

Бамп

20 ноя 2017, 21:11 44 1095138

>>1077271 (OP)
Есть ли фриланс на хаскеле?

Ответы095378

21 ноя 2017, 08:03 45 1095378

>>1095138
Есть.

Ответы096135

57 Кб, 1280x720
21 ноя 2017, 14:19 46 1095511

>>1077467
>2012

21 ноя 2017, 14:23 47 1095514

>>1087177
Я вот тут от балды написал прикладной http сервант на ocaml, что бы несколько спустя дней сыпя проклятиями переметнуться на хаскелл, напиать от балды сервак на нем и успокоиться. Так что не все так однозначно, особенно учитывая то, что уже haskell 6.12 имеет конкурентный сборщик мусора и сам из коробки умеет использовать несколько ядер.
1) Откровенный, признанный в рассылке баг в Lwt, собранный с ним ocsigen, фикс есть, но надо почти весь окамловый мир пересобрать. Даже на ubuntu 10.10 он еще есть.
2) Если жить с этим багом, то это приводит к тому, что сервер становится блокирующим. Это вообще неприемлемо, при сколь угодно маленьких нагрузках
3) Собранный хаскеллем бинарник будет жить на любом вообще почти линуксе --- там динамические зависимости от малого количества системных библиотек. Его не поломать сменой энвайромента
4) На окамле так теоретически можно, на практике за половину дня у меня не получилось (может я тупой, но я лучше буду на хаскелле код писать, чем бодаться со сборкой и путями к библиотекам и чтением манов на ocamlfind)
5) Happstack очень хороший и он проще в использовании, чем Ocsigen, хотя и не такой пока навороченный. Но лучше все равно.
6) 90% из того, что я пишу в окамле руками, в хаскелле уже есть
7) В компиляторе хаскелла правильный подход к компиляции, к представлению значений в памяти, и люди над компилятором работают, а не занимаются черти-чем. Это значит, что момент, когда хаскелл станет уделывать окамл по вычислениям --- неизбежно наступит, это только вопрос времени. Представление чисел в Окамле --- это какой-то позор, при том, что есть SML/MLTon и Эндрю Аппель. Работа с этими числами и их типами при отсутствии тайпклассов --- это тоже позор. Так что окамл быстро работает только на 31-битной арифметике (ну или 63-битной, но я не уверен, что в 64-битной сборке примитивные типы 63-битные) Может, в хаскелле оно вообще сейчас боксед всё, я не знаю, но динамика развития компилятора говорит о том, что это временно
8) Темпы развития компилятора и рантайма хаскелла - в нём уже есть конкурентный сборщик и масштабирование по ядрам, а не отмазки, что это все сложно и потребует больших переделок. Работает само (на примере хаппстека). Т.е. теже драйвера HDBC --- уже сами по себе написаны в неблокирующей манере и прозрачно работают с ForkIO, а не требуют запуска в нативных тредах или переписывания, как окамле (я не говорю про качество самих драйверов еще).

21 ноя 2017, 14:23 47 1095514

>>1087177
Я вот тут от балды написал прикладной http сервант на ocaml, что бы несколько спустя дней сыпя проклятиями переметнуться на хаскелл, напиать от балды сервак на нем и успокоиться. Так что не все так однозначно, особенно учитывая то, что уже haskell 6.12 имеет конкурентный сборщик мусора и сам из коробки умеет использовать несколько ядер.
1) Откровенный, признанный в рассылке баг в Lwt, собранный с ним ocsigen, фикс есть, но надо почти весь окамловый мир пересобрать. Даже на ubuntu 10.10 он еще есть.
2) Если жить с этим багом, то это приводит к тому, что сервер становится блокирующим. Это вообще неприемлемо, при сколь угодно маленьких нагрузках
3) Собранный хаскеллем бинарник будет жить на любом вообще почти линуксе --- там динамические зависимости от малого количества системных библиотек. Его не поломать сменой энвайромента
4) На окамле так теоретически можно, на практике за половину дня у меня не получилось (может я тупой, но я лучше буду на хаскелле код писать, чем бодаться со сборкой и путями к библиотекам и чтением манов на ocamlfind)
5) Happstack очень хороший и он проще в использовании, чем Ocsigen, хотя и не такой пока навороченный. Но лучше все равно.
6) 90% из того, что я пишу в окамле руками, в хаскелле уже есть
7) В компиляторе хаскелла правильный подход к компиляции, к представлению значений в памяти, и люди над компилятором работают, а не занимаются черти-чем. Это значит, что момент, когда хаскелл станет уделывать окамл по вычислениям --- неизбежно наступит, это только вопрос времени. Представление чисел в Окамле --- это какой-то позор, при том, что есть SML/MLTon и Эндрю Аппель. Работа с этими числами и их типами при отсутствии тайпклассов --- это тоже позор. Так что окамл быстро работает только на 31-битной арифметике (ну или 63-битной, но я не уверен, что в 64-битной сборке примитивные типы 63-битные) Может, в хаскелле оно вообще сейчас боксед всё, я не знаю, но динамика развития компилятора говорит о том, что это временно
8) Темпы развития компилятора и рантайма хаскелла - в нём уже есть конкурентный сборщик и масштабирование по ядрам, а не отмазки, что это все сложно и потребует больших переделок. Работает само (на примере хаппстека). Т.е. теже драйвера HDBC --- уже сами по себе написаны в неблокирующей манере и прозрачно работают с ForkIO, а не требуют запуска в нативных тредах или переписывания, как окамле (я не говорю про качество самих драйверов еще).

Показать весь текст
Ответы095587095589095624

21 ноя 2017, 17:29 48 1095587

>>1095514
>6) 90% из того, что я пишу в окамле руками, в хаскелле уже есть
А ты какой стдлиб используешь, братишка?

21 Кб, 349x356
21 ноя 2017, 17:31 49 1095589

>>1095514
> динамика развития компилятора говорит о том, что это временно
> языку 25 лет
> это временно

21 ноя 2017, 17:33 50 1095590

Ну а так х-ль, конечно, во всех отношениях приятней верблюда, тут не поспоришь. Но приятность - хипстерская категория, атата!

Алсо, тайпклассы - зло.

Ответы107190

21 ноя 2017, 18:41 51 1095624

>>1095514
это паста 2010 года?

22 ноя 2017, 17:01 52 1096135

>>1095378
В него реально вкатиться?

Ответы096259

22 ноя 2017, 20:48 53 1096259

>>1096135
Смотря кому.

Ответы096389

23 ноя 2017, 04:45 54 1096389

>>1096259
А кому нереально?

23 ноя 2017, 22:09 55 1096877

Постепенно я прихожу к мысли, что в данный момент языком с лучшей системой типов является JS.

Нужны ADT? Их нет, но 'type Vehicle = {type:"CAR", ... }|{type:"TRAIN", ...}' в сочетании с 'let handlers = {CAR: handleCar, TRAIN: handleTrain}' даст подобие паттерн-матчинга с exhaustiveness check.
Нужны тайпклассы? Их нет, но вместо 'sort :: Ord a => [a] -> [a]' можно определить 'sort<A>(ctx: { compare: (A, A) => "EQ" | "GT" | "EQ" }, a: A[]): A[]', что уступает в изяществе и удобстве, но работает не хуже.
Нужна чистота? Можно завернуть все в Eff с какими пожелаешь эффектами.
Нужна do-нотация? Так не нужна же.
Нужно содомизировать свой код, игнорируя корректность происходящего в некоторых его частях? Тайпчекер не станет мешать, babel выкинет типы без каких-либо возражений, не заставляя исправлять каждый недочет.

Выходит, что в JS доступна значительная часть плюсов продвинутых систем типов, но при этом не приходится преодолевать их ограничения. Зачем же использовать что-либо более строгое?

Ответы096999097447

24 ноя 2017, 01:43 56 1096999

>>1096877
>Зачем же использовать что-либо более строгое?
Затем, что есть clojurescript.

мимокапитандекомплектед

Ответы097101

24 ноя 2017, 11:35 57 1097101

>>1096999
Рич, отъебись. Пока не объяснишь внятно, как рефакторить тысячи строк кода без единого теста, в твою секту я не вступлю.
Кстати, а какие профиты у кложуроскрипта перед js? Обработка sparse data, с которой проблемы у типосектантов, в js не является чем-то затруднительным. Макросы? Есть сахарок, если сильно надо. Иммутабельность? Ее нет, но ее легко эмулировать. Figwheel+re-frame? React+redux тоже состояние не теряют, работать удобно.

Ответы097226

24 ноя 2017, 16:14 58 1097226

>>1097101
>рефакторить тысячи строк кода без единого теста
Ээ... ты о чем?

> Кстати, а какие профиты у кложуроскрипта перед js?
1 + "2" уже посчитал?

> Макросы? Есть сахарок, если сильно надо.
Что ты несешь, какой сахарок? Макросы нужны, чтобы core.async, спек и тайпчекер сделать подключаемыми либами, а не ждать джвадцать лет es6 тащить все это говно в язык.

> Иммутабельность? Ее нет, но ее легко эмулировать.
Смешно. Это сразу делает очевидным тот факт, что ты не писал ничего как минимум на функциональных языках, а потому не можешь сравнивать объективно. Из разряда "В ассемблере тоже иммутабельность легко эмулировать))00))".

> React+redux тоже состояние не теряют
Ну так редукс по-твоему чем вдохновлялся? Оригинал, тем не менее, по-прежнему лучше. Если сумеешь все это говно настроить, ахахахахахаха

25 ноя 2017, 00:41 59 1097447

>>1096877
>Алсо, тайпклассы - зло.
Нет. Вполне рабочий инструмент. Едиственный момент - не надо путать тайпклассы с интерфейсами из ООП, например. Интерфейс - это набор методов. А тайпкласс - набор прведений.

Ответы097464

25 ноя 2017, 01:28 60 1097464

>>1097447
Тайпкласс - это имплицитная загрузка кода. Неявное поведение == зло. Алсо, ты постом промазал чуток.

Ответы097543097586

25 ноя 2017, 12:11 61 1097543

>>1097464
Поведение всегда явное, подключение происходить неявно. Не нужно смешивать.
Тайпклассы зарекомендовали себя, как один из лучших паттернов, отличная замена антипаттерну "наследование"

Ответы097682

25 ноя 2017, 14:52 62 1097586

>>1097464
>Тайпкласс - это имплицитная загрузка кода. Неявное поведение == зло
На ассемблере пишешь?

Ответы097615097682

25 ноя 2017, 16:34 63 1097615

>>1097586
Помню в школе паскаль преподавали, так и говорили.

25 ноя 2017, 19:13 64 1097682

>>1097543
>Не нужно смешивать.
Ну так вот ты как раз и смешиваешь, разделяя некое магическое ПОДКЛЮЧЕНИЕ и поведение\декларации. В этом и проблема (часть проблемы).

> антипаттерну "наследование"
Тайпклассы - замена наследованию? Please tell me more. Вообще, даже за любое упоминание слова "наследование" итт нужно проводить профилактическое анальное изнасилование, да.

>>1097586
Пошел вон из треда.

26 ноя 2017, 01:49 65 1097895

Например в языке Scala есть и то и другое. В простейших ситуациях можно использовать наследование, но когда нужен вариант более лучший, ну или скилл у программиста подлиннее, используют тайпклассы.

Ответы097897

26 ноя 2017, 01:55 66 1097897

>>1097895
Два анальных изнасилования этому господину джаварабу.

Хуль вы вообще вспомнили про это наследование? Никто про него не говорит, никто его не сравнивает с тайпклассами. Тайпклассы - говно, а наследование - это даже не говно, это просто преступление против человечества, за такое сжигать живьем в печах освенцима нужно.

Если кто-то еще хоть раз скажет "наследование" в этом треде, я пукну

Ответы097941098248098290

26 ноя 2017, 09:00 67 1097941

>>1097897
Полностью с тобой согласен.

26 ноя 2017, 18:33 68 1098248

>>1097897
Другой пример. Ocaml, все гордятся своими модулями, а на деле в большинстве случаев имитируют тайпклассы, которые только кидают руками. А во влажных мечтах хотят полиморфизма, ждут модульных имплицитов, потому что писать +. и print_string не солидно.

Да, я не джавараб, никогда не писал на джаве, лишь интересовался скалой. Я таки вкатываюсь в окамл, ибо в жизни не хватает точечек и нижних подчеркиваний

26 ноя 2017, 19:37 69 1098290

>>1097897
Если наследование такое говно, то как ты будешь моделировать объекты, которые в жизни реально друг от друга наследуются (типа person/manager/employee и т д)?

Ответы098291098305098312098327

26 ноя 2017, 19:40 70 1098291

>>1098290
Это и в жизни скорее тайпклассы, чем наследование

26 ноя 2017, 20:18 71 1098305

>>1098290
>в жизни реально друг от друга наследуются
А вот и ООП-головного-мозга подъехало. И понесло какую-то чушь как и всегда.

Ответы098331

26 ноя 2017, 20:28 72 1098312

>>1098290
Ну, например, так же, как это делают разработчики игровых движков еще с середины 90-ых - с помощью композиции. Но ооп-манька об этом ничего не слышала, у нее же наследование вместо мозга.

Ответы098331

26 ноя 2017, 20:44 73 1098327

>>1098290
В жизни хорошо наследуются только наследства.

26 ноя 2017, 20:47 74 1098331

>>1098312
>>1098305
Не обоссывайте, я просто интересуюсь. Сам пишу на скале, че такое тайпклассы знаю.

Ответы098448

26 ноя 2017, 23:17 75 1098448

>>1098331
> Не обоссывайте
Хорошо, но только если ты пояснишь, каким образом Менеджер наследуется от Человека. Менеджер - это такой биологический подвид человеков, я правильно понял? А Батя - другой подвид, так? То есть у тебя с твоей еотовой может родиться либо Менеджер, либо Батя, ну либо просто абстрактный Чоловiк, так?

Ответы098505

27 ноя 2017, 00:59 76 1098505

>>1098448
Ну не так написал, скорее manager - это подвид employee.

27 ноя 2017, 01:15 77 1098510

В принципе, я понял. С одной стороны, если использовать композицию вместо наследования, будет как-то неестественно, что у Manager есть поле Employee. С другой стороны, если никогда не использовать наследование и неявно предполагать, что под manager и employee имеется в виду то, что в ооп назвали бы ManagerData и EmployeeData, то не так уж это и плохо. А поведение реализуется через тайпклассы. Ну понятно.

Ответы098512

27 ноя 2017, 01:34 78 1098512

>>1098510
>что у Manager есть поле Employee.
Щито? Нет, у Чоловика есть компоненты Менеджер и Сотрудник.

> неестественно
Классы не предназначены для моделирования предметной области. Если ты используешь классы для домейна, то ты doing it wrong. Классы - это низкоуровневый механизм абстракции состояния. Смешивать уровни абстракции - типикал говноедство.

> А поведение реализуется через тайпклассы.
Через тайпклассы реализуется полиморфизм. Если поведение не предполагает полиморфизма, то и тайпклассы не нужны.

Ответы098548

27 ноя 2017, 03:19 79 1098548

>>1098512
Смотри, как можно сделать то же, что и здесь
https://pastebin.com/T0qJen1Y
без наследования? Если не использовать наследование, то как избежать необходимости определять инстанс тайпкласса для каждого из типов? В хаскеле можно написать deriving(Show), но представь, что у меня не Show, а какой-нибудь тайпкласс, который нельзя автоматически вывести.

Очевидно, что если типы Node, InternalNode и Leaf связаны через композицию, а не через наследование, то компилятор никак не сможет автоматически вывести инстанс тайпкласса. Чтобы вывести, придется для каждого класса бойлерплэйтную хуйню писать:
https://pastebin.com/4FVBNR0W
Или вот так еще можно:
https://pastebin.com/giQNGZCC
Наверное, можно как-то поколдовать, чтобы тайпкласс через метод derive выводился автоматически, но это уже будет жесткая наркомания с неявными преобразованиями, что намного хуже наследования.

Ответы098913

27 ноя 2017, 18:32 80 1098913

>>1098548
>https://pastebin.com/T0qJen1Y
Зойчем? data Node = хуй | пизда, какие классы вообще?

Ответы099300

28 ноя 2017, 02:42 81 1099300

>>1098913
Только с версии 3.0 в скалку заедет, пока приходится наследовать

Ответы099318

28 ноя 2017, 03:53 82 1099318

>>1099300
Ээ, так кейс-классы - это как бы абсолютно то же самое, что дата в х-ле, просто с нескучным синтаксисом для джава-господмакак, не?

Ответы099325

28 ноя 2017, 04:25 83 1099325

>>1099318
По сути да. Просто подъедет сахарок и можно будет не писать бойлерплейт sealed trait case class case class

32 Кб, 179x254
12 дек, 00:37 84 1106443

Жабакодер репортинг ин, решил изучать ФП, в этом треде буду решать упражнения из SICP. Пофиг, что они для схемы, в этих ваших ленивостях и гомоиконностях вся равно ничего не понятно.

https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html

12 дек, 00:45 85 1106449

Упражнение 1.1.

Ниже приведена последовательность выражений. Каков результат, напечатанный интерпретатором в ответ на каждое выражение? Предположим, что последовательность должна быть оценена в том порядке, в котором она представлена.

-- 10
print $ 10

-- (+ 5 3 4)
print $ foldr (+) 0 [5, 3, 4]

-- (- 9 1)
print $ (-) 9 1

-- (/ 6 2)
print $ (/) 6 2

-- (+ ( 2 4) (- 4 6))
print $ (+) (() 2 4) ((-) 4 6)

-- (define a 3)
a :: Int
a = 3

-- (define b (+ a 1))
b :: Int
b = (+) a 1

-- (+ a b ( a b))
print $ foldr (+) 0 [a, b, (() a b)]

-- (= a b)
print $ (==) a b

-- (if (and (> b a) (< b ( a b)))
-- b
-- a)
print $ if (&&) ((>) b a) ((<) b (() a b)) then b else a

-- (cond ((= a 4) 6)
-- ((= b 4) (+ 6 7 a))
-- (else 25))
cond :: Int
cond | (==) a 4 = 6
| (==) b 4 = foldr (+) 0 [6, 7, a]
| otherwise = 25

-- (+ 2 (if (> b a) b a))
print $ (+) 2 (if (>) b a then b else a)

-- ( (cond ((> a b) a)
-- ((< a b) b)
-- (else -1))
-- (+ a 1))
cond :: Int
cond = () x ((+) a 1) where
x | (>) a b = a
| (<) a b = b
| otherwise = -1

12 дек, 00:45 85 1106449

Упражнение 1.1.

Ниже приведена последовательность выражений. Каков результат, напечатанный интерпретатором в ответ на каждое выражение? Предположим, что последовательность должна быть оценена в том порядке, в котором она представлена.

-- 10
print $ 10

-- (+ 5 3 4)
print $ foldr (+) 0 [5, 3, 4]

-- (- 9 1)
print $ (-) 9 1

-- (/ 6 2)
print $ (/) 6 2

-- (+ ( 2 4) (- 4 6))
print $ (+) (() 2 4) ((-) 4 6)

-- (define a 3)
a :: Int
a = 3

-- (define b (+ a 1))
b :: Int
b = (+) a 1

-- (+ a b ( a b))
print $ foldr (+) 0 [a, b, (() a b)]

-- (= a b)
print $ (==) a b

-- (if (and (> b a) (< b ( a b)))
-- b
-- a)
print $ if (&&) ((>) b a) ((<) b (() a b)) then b else a

-- (cond ((= a 4) 6)
-- ((= b 4) (+ 6 7 a))
-- (else 25))
cond :: Int
cond | (==) a 4 = 6
| (==) b 4 = foldr (+) 0 [6, 7, a]
| otherwise = 25

-- (+ 2 (if (> b a) b a))
print $ (+) 2 (if (>) b a then b else a)

-- ( (cond ((> a b) a)
-- ((< a b) b)
-- (else -1))
-- (+ a 1))
cond :: Int
cond = () x ((+) a 1) where
x | (>) a b = a
| (<) a b = b
| otherwise = -1

Показать весь текст
Ответы106514106884

12 дек, 08:46 86 1106514

>>1106449
Макаба сожрала звездочки же. Пастебин пасти. Алсо, мне кажется, или в последнем ты что-то намудрил?

Ответы106597

12 дек, 15:40 87 1106597

>>1106514
М, и правда сожрала. Завел фейкогитхабчик, буду туда постить - https://github.com/functional-experiments/sicp/blob/master/exercise_1.01.hs

> Алсо, мне кажется, или в последнем ты что-то намудрил?

Ага, перевожу там лисповый cond в guards, но не знаю, как guards записать inline (это вообще возможно?). Поэтому вынес весь cond в отдельный where - https://github.com/functional-experiments/sicp/blob/master/exercise_1.01.hs#L23

Ответы106627

165x36
12 дек, 15:43 88 1106598

Упражнение 1.2.

Перевести следующее выражение в префиксную форму

https://github.com/functional-experiments/sicp/blob/master/exercise_1.02.hs

Ответы106628

12 дек, 16:41 89 1106627

>>1106597
Еще бы | выровнять.

Ответы106845

12 дек, 16:42 90 1106628

>>1106598
На х-ле это, конечно, выглядит инфернально.

13 дек, 00:41 91 1106845

>>1106627
Чего-то пока не определился с отступами, какие-то неочевидные требования к ним в .hs файлах.

Упражнение 1.3.

Определите процедуру, которая принимает три числа в качестве аргументов и возвращает сумму квадратов двух наибольших чисел.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.03.hs

Ответы106949

13 дек, 06:03 92 1106884

>>1106449
В чем смысл этих упражнений по написанию неидиоматичного кода?

Ответы107163

13 дек, 13:52 93 1106949

>>1106845
> sqsum1 a b c = res where
> ...
> res = foldr (+) 0 squared
АСТАНАВИТЕСЬ

используй комбинаторы, если хочешь писать в порядке исполнения

Ответы107163

13 дек, 14:12 94 1106955

https://pastebin.com/raw/7KbL980B
https://gist.github.com/bodhi/cc4f3ac32d8302de2a8b

Ответы107163

13 дек, 21:44 95 1107163

>>1106884
Смысл в том, чтобы научиться что-нибудь писать, а затем понять, как писать это "идиоматически". Пока намеренно префиксные операторы использую, чтобы было больше похоже на схему.

Ну и первые примеры в SICP - helloworld'ы, далее должно интереснее стать.

>>1106949
Спс, прочитал вот это https://wiki.haskell.org/Combinator уже раза 4 и пока не вкурил, что это. Пойду LYAH полистаю.

>>1106955
По первой ссылке - неясно в чем профит, т.е. те же самые операции можно одной строкой записать, но зачем? В математике - 1 преобразование на 1 строку же. По второй - пока ничего не понял, это похоже на какой-то хитроприготовленный JS вроде https://github.com/sanctuary-js/sanctuary

Ответы107205107217

13 дек, 21:47 96 1107166

Упражнение 1.4.

Заметим, что наша модель исполнения позволяет комбинации, операторы которых являются составными выражениями. Используйте это наблюдение для описания поведения следующей процедуры:

(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))

https://github.com/functional-experiments/sicp/blob/master/exercise_1.04.hs

Ответы107206

13 дек, 22:55 97 1107190

>>1095590
>Алсо, тайпклассы - зло.
И тут ты такой - аргументируешь.

Ответы107207

13 дек, 23:11 98 1107205

>>1107163
Комбинаторы == функции высшего порядка. Я имел в виду |>.

Дело не в одной строке (записывай в несколько, если хочешь), а в абсолютно лишних и засоряющих код именах. f x = foo where foo = bar - это вообще из серии if x is true then true else false.

По второй - абсолютно тот же самый код, что с точками, просто композиция идет в том порядке, в котором этот код будет выполняться (слева направо) - точно так же, как у тебя с именами. Примерно то же, что -> в кложе и |> в эликсире (ну и в окамле\эфшарпе, конечно).

С точечкой (композицией) или долларом (аппликацией) ты пишешь функции в том же порядке, в каком писал бы их со скобочками:
h $ g $ f $ x == h(g(f x))

Сперва выполняется f x, потом к результату применяется g, потом к этому результату применяется h.

С пайпострелочкой ты пишешь функции в том же порядке, в котором они применяются:
x |> f |> g |> h

Сперва выполняется f x, потом к результату применяется g, потом к этому результату применяется h.

Это просто аппликация, в которой аргумент слева от функции:
( $ ) f x = f x
( |> ) x f = f x

x |> f == f $ x == f x

Эх, поставить х-ль да присоединиться к тебе, что ли?

Ответы107222

13 дек, 23:17 99 1107206

>>1107166
Господи, что за наркомания? Оно вообще компилируется?

aPlusAbsB a b = (if b > 0 then (+) else (-)) a b

Ответы107211

13 дек, 23:18 100 1107207

>>1107190
Аргументировал же уже где-то там выше. Неявное поведение, нелокальные эффекты, глобальное состояние of sorts.

13 дек, 23:22 101 1107211

>>1107206
А если третий вариант появится - то вложенный if делать?

Ответы107240

13 дек, 23:36 102 1107217

>>1107163
Почему бы не писать сразу нормально? Ну, например, очевидно, что foldr для простых арифметических операций нахуй не нужен, что в cond'е потребности нет в виду наличия guard'ов и т.д.

Ответы107227

13 дек, 23:47 103 1107222

>>1107205
Т.е. это такой оператор "задом-наперед":

(|>) :: a -> (a -> b) -> b
a |> b = b a

Классно, конечно, что можно синтаксис менять так просто, но я пока стараюсь максимально прямолинейно писать.

Про $ и . почитал LYAH - http://learnyouahaskell.com/higher-order-functions#function-application , оттуда:

> Хорошо, потому что $ является право-ассоциативным, f (g (z x)) равно f $ g $ z x. Итак, мы можем переписать
>
> sum (filter (> 10) (map (2) [2..10]))
>
> в виде
>
> sum $ filter (> 10) $ map (2) [2..10]

Это какое-то проявление ненависти к скобкам/лиспу? Запись только скобками отличается же. И с "." аналогично. Ну т.е. синтаксический сахар - это хорошо, но я пока продолжу в стиле "императивное быдло, сэр" писать.

Я как понимаю, такая гибкость синтаксиса далее с более сложными конструкциями пригодится, но до них еще не дошел.

Ответы107240

13 дек, 23:53 104 1107227

>>1107217
>Ну, например, очевидно, что foldr для простых арифметических операций нахуй не нужен

Хм, а как тогда ближе всего к схеме записать вот это:

(+ 6 7 a)

Вот такой фолдр наиболее близким выглядит:

foldr (+) 0 [6, 7, a]

Понятно, что "6 + 7 + a" тоже сработает, но в схеме это list же, а не просто 3 значения.

Про cond - согласен.

Ответы107239

14 дек, 00:20 105 1107239

>>1107227
Нет там списка, по крайней мере явно. Ну и блджад, кто ж дословно-то переводит?
>(+ 6 7 a)
6 + 7 + a
>(fold-right + (list 6 7 a))
А вот тут есть список.

Ответы107241

14 дек, 00:21 106 1107240

>>1107211
Как он у тебя появится, если тебе нужно конкретную функцию написать? Хуйней не страдай, ммкей? Если нужно использовать матч - используй матч (только нормальный матч, а не ту наркоманию, которую ты там нагородил), если нужно использовать иф - используй иф.

>>1107222
>"задом-наперед":
Ну, ээ, наоборот. Обычная композиция\аппликация - задом наперед (в начале - последняя операция, в конце - первая), поэтому и нужен или ненужен |>.

> можно синтаксис менять так просто
Это не имеет к синтаксису никакого отношения, это просто обычная функция. Вот поэтому, кстати, сикп и использует scheme - чтобы не возникало путаницы с этими понятиями.

> Это какое-то проявление ненависти к скобкам/лиспу?
Возможно, лол. На самом деле просто плоские линейные последовательности читать проще, чем вложенные древовидные. В лиспах это тоже есть (и с правильным порядком по умолчанию, слева-направо).

> я пока продолжу в стиле "императивное быдло, сэр" писать.
Извини конечно, но ты пока пишешь в стиле "я обдолбался добом, засунул дилду в себе анус и пошел танцевать". Я же выше кидал https://pastebin.com/raw/7KbL980B пример того, как надо выравнивать и писать гарды - а ты все равно не выравниваешь и пишешь foo x = y where y = z.

Ответы107436

14 дек, 00:24 107 1107241

>>1107239
Не, ну тут тащем-то его интент вполне понятен. Но все-таки да, 6 + 7 + a лучше - и главное ближе к оригиналу.

Наиболее близкий и наиболее близким ВЫГЛЯДИТ - это все-таки очень разные вещи (вторая - бесполезнее).

Ответы107242

14 дек, 00:26 108 1107242

>>1107241
>его интент
Хоспаде, что за рунглиш?

Ответы107244

14 дек, 00:29 109 1107244

>>1107242
А сочетания "мой компьютер" или "ее вагина" тебя не смущают?

Ответы107263

14 дек, 01:27 110 1107263

>>1107244
С заимствованием терминов, названий новых вещей ещё можно смириться, но вытеснение инородными обычных разговорных слов выглядит просто отвратительно. Примерно так же, как foldr (+) или cond в коде того анона.

Ответы107370107381

14 дек, 11:51 111 1107370

>>1107263
>названий новых вещей
>вагина
Ололо, девственники в треде!

К тому же, это тоже термин. Вот, например: https://ru.wikipedia.org/wiki/Интент-анализ

Алсо, я не уверен, какое слово ты предлагаешь использовать вместо. "Намерение" не совсем подходит.

355 Кб, 1047x607
14 дек, 12:18 112 1107381

>>1107263
>но вытеснение инородными обычных разговорных слов выглядит просто отвратительно

Изи-изи, эт не рил ток, синк эбаут ит, мэн.

14 дек, 14:24 113 1107436

>>1107240
Посмотрел еще раз код, я понял в чем проблемы.

С foldr (+) ... - вместо обычной суммы. Это намеренно делается. Обычная сумма и из Java-бекграунда нормально воспринимается. А foldr и прочие ф-циональные записи, более сложные, чем простой map (ололо - Guava) - вводят в ступор и на них надо минуту смотреть, пока поймешь в чем дело. Поэтому буду продолжать всюду foldr'ы использовать, чтобы мозжечок привыкал их читать.

С where похожая ситуация, если функция вот так записана:

fun1 :: Int -> Int -> Int
fun1 a b = res where
...
res =...

То сознание, искалеченное Жабой (и Скриптом), автоматически переводит это в:

static int fun1(int a, int b) {
...
return ...
}

А если записано вот так:

fun1 :: Int -> Int -> Int
fun1 0 b = 42
fun1 1 b = ...
fun1 a 42 = ...

то парсер сразу падает с ошибкой (функция перегружена некорректно лол). Поэтому, несмотря на эстетические чувства окружающих, буду дальнейшие примеры также делать.

А выравнивание гардов - учел.

14 дек, 14:24 113 1107436

>>1107240
Посмотрел еще раз код, я понял в чем проблемы.

С foldr (+) ... - вместо обычной суммы. Это намеренно делается. Обычная сумма и из Java-бекграунда нормально воспринимается. А foldr и прочие ф-циональные записи, более сложные, чем простой map (ололо - Guava) - вводят в ступор и на них надо минуту смотреть, пока поймешь в чем дело. Поэтому буду продолжать всюду foldr'ы использовать, чтобы мозжечок привыкал их читать.

С where похожая ситуация, если функция вот так записана:

fun1 :: Int -> Int -> Int
fun1 a b = res where
...
res =...

То сознание, искалеченное Жабой (и Скриптом), автоматически переводит это в:

static int fun1(int a, int b) {
...
return ...
}

А если записано вот так:

fun1 :: Int -> Int -> Int
fun1 0 b = 42
fun1 1 b = ...
fun1 a 42 = ...

то парсер сразу падает с ошибкой (функция перегружена некорректно лол). Поэтому, несмотря на эстетические чувства окружающих, буду дальнейшие примеры также делать.

А выравнивание гардов - учел.

Показать весь текст
Ответы107454107686107743

14 дек, 14:34 114 1107439

Упражнение 1.5.

Бен Битдидл изобрел тест, чтобы определить, с каким интерпретатором он сталкивается, использует оценку аппликативного порядка или оценку нормального порядка. Он определяет следующие две процедуры:

(define (p) (p))

(define (test x y)
(если (= x 0)
0
у))

Затем он оценивает выражение

(тест 0 (p))

Какое поведение Бена будет наблюдать с помощью интерпретатора, который использует оценку аппликативного порядка? Какое поведение он будет наблюдать с помощью интерпретатора, который использует оценку нормального порядка? Поясните свой ответ.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.05.hs

Здесь подвох вот в этой функции:

p :: Int
p = p

Удивился немного, когда она скомпилилась. Вопрос предполагает, что при нормальном порядке вычисления, интерпретатор повиснет на раскрытии p = p, а при аппликативном - не дойдет до него. Так как if/guard в хаскеле - short-circuting, то p никогда не выполнится (dead code elimination все дела).

Что интересно, "test p 0" успешно вешает runghc - ленивость не помогает.

14 дек, 14:34 114 1107439

Упражнение 1.5.

Бен Битдидл изобрел тест, чтобы определить, с каким интерпретатором он сталкивается, использует оценку аппликативного порядка или оценку нормального порядка. Он определяет следующие две процедуры:

(define (p) (p))

(define (test x y)
(если (= x 0)
0
у))

Затем он оценивает выражение

(тест 0 (p))

Какое поведение Бена будет наблюдать с помощью интерпретатора, который использует оценку аппликативного порядка? Какое поведение он будет наблюдать с помощью интерпретатора, который использует оценку нормального порядка? Поясните свой ответ.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.05.hs

Здесь подвох вот в этой функции:

p :: Int
p = p

Удивился немного, когда она скомпилилась. Вопрос предполагает, что при нормальном порядке вычисления, интерпретатор повиснет на раскрытии p = p, а при аппликативном - не дойдет до него. Так как if/guard в хаскеле - short-circuting, то p никогда не выполнится (dead code elimination все дела).

Что интересно, "test p 0" успешно вешает runghc - ленивость не помогает.

Показать весь текст
Ответы107454

14 дек, 15:02 115 1107454

>>1107436
>С foldr (+) ... - вместо обычной суммы.
Тебе просто говорят, что (+ 1 2 3) - это не то же самое, что foldr (+) [1 2 3], а ты вроде как думал, что это то же самое, что неверно.

Второй поинт не уловил. Раз парсер на той записи падает с ошибкой, то надо же как раз и упражнять мозжечок на эту запись, чтоб он не падал, не?

>>1107439
В четвертый раз говорю, что для гардов не нужен where. Зачем ты там "res" написал? Еще раз посмотри на cmp1 здесь: https://pastebin.com/raw/7KbL980B
И сравни с https://github.com/functional-experiments/sicp/blob/master/exercise_1.05.hs#L26
Зачем ты там res написал?

Прочитай "Guards, guards!" в http://learnyouahaskell.com/syntax-in-functions

Опять же, поэтому сикп и использует схемку с минимумом синтаксиса.

>>1107439
Алсо, я не понял, ты через гугл транслейт текст прогоняешь, лол? Нахуя? Какая еще "оценка аппликативного порядка", лол? У сикпа есть замечательный русский перевод, если что.

>>1107439
>Так как if/guard в хаскеле - short-circuting, то p никогда не выполнится (dead code elimination все дела).
If\guard в хаскеле не short-circuiting, в х-ле все вычисления ленивые. Ни ифы, ни гарды тут ни при чем. С dead code elimination это тоже не имеет ничего общего. Это техника оптимизации выхлопа компилятора, к порядку исполнения не имеет вообще никакого отношения.

> Что интересно, "test p 0" успешно вешает runghc
Потому что ты аргументы местами перепутал, должно быть test 0 p.

Ответы107686

14 дек, 15:08 116 1107461

А, ну и алсо:
> Здесь подвох вот в этой функции:
- это не функция.

Еще одна причина, по которой в сикп используется схемка, лол.

Ответы107686

14 дек, 23:19 117 1107686

>>1107454
>Зачем ты там res написал?

См подробно тут >>1107436 , это такая фича.

>>1107454
>Алсо, я не понял, ты через гугл транслейт текст прогоняешь, лол? Нахуя? Какая еще "оценка аппликативного порядка", лол?

Это чтобы мимокрокодилы не пугались от вида простыней на нерусском. Ссылку на оригинал SICP, откуда копипастю, постил выше.

"оценка аппликативного порядка" - классный термин по-моему, надо будет его рекомендовать всем, кто в ФП вкатывается, как "первое, что надо в ФП изучить".

> У сикпа есть замечательный русский перевод, если что.

А он есть в открытом доступе? Что-то не гуглится, а то буду оттуда копипастить.

>>1107461
Лол, а что это? Я думал в хаскеле все что в таком же виде как функция объявляется - все будет функцией.

Ответы107743107746109195109458

14 дек, 23:22 118 1107687

Упражнение 1.6.

Алисса П. Хакер не понимает, почему, если нужно предоставить специальную форму. «Почему я не могу просто определить его как обычную процедуру с точки зрения cond?», - спрашивает она. Друг Алиссы Эва Лу Атор утверждает, что это действительно можно сделать, и она определяет новую версию if:

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))

Ева демонстрирует программу для Алиссы:

(new-if (= 2 3) 0 5)
5

(new-if (= 1 1) 0 5)
0

Delighted, Alyssa использует new-if, чтобы переписать программу с квадратным корнем:

(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))

Что происходит, когда Алисса пытается использовать это для вычисления квадратных корней? Объясните.

Ответы107688

14 дек, 23:26 119 1107688

>>1107687

https://github.com/functional-experiments/sicp/blob/master/exercise_1.06.hs

А вот на этом упражнении я подвис. После гугления понял, что в схеме у встроенного if и самописного if будут разные правила выполнения. Вроде как short-circuit https://en.wikipedia.org/wiki/Short-circuit_evaluation не должно быть у самописного if. В комментариях к читам sicp по этому поводу срач - http://community.schemewiki.org/?sicp-ex-1.6

В итого сделал через лямбды, чтобы в моем самописном if точно было все лениво.

Ответы107692107750

14 дек, 23:35 120 1107692

>>1107688
Перечитал wiki, про short-circuit условие неправильно написал (он не влияет), это then и else должны по разному выполняться.

15 дек, 01:25 121 1107743

>>1107686
>См подробно тут >>1107436 , это такая фича.
АААААААА СУКА БЛЯДЬ ТЫ ИЗДЕВАЕШЬСЯ НАХУЙ?! КАКАЯ НАХУЙ ФИЧА, Я ТЕБЕ УЕБУ СЕЙЧАС, БЛЯДЬ! ТЫ ТАМ ПИШЕШЬ ПРО КУСОЧНЫЕ ФУНКЦИИ, А Я ТЕБЯ ГОВОРЮ ПРО ГАРДЫ! СУКА, БЛЯДЬ! ИЗДЕВАЕШЬСЯ, СУУУКААА?! https://github.com/functional-experiments/sicp/blob/master/exercise_1.05.hs#L26 ВОТ ЗДЕСЬ ТОЧНО ТОТ ЖЕ САМЫЙ КОД БЛЯДЬ БУДЕТ, БЕЗ КУСОЧНЫХ ФУНКЦИЙ, С ТЕМИ ЖЕ САМЫМИ ГАРДАМИ, БЛЯДЬ, ТОЛЬКО БЕЗ WHERE, ПОТОМУ ЧТО БЛЯДЬ ТЫ ВОЗВРАЩАЕШЬ RES И СРАЗУ ЖЕ ГАРДЫ НА НЕГО ВЕШАЕШЬ, БЛЯДЬ, ПРОСТО УБЕРИ RES WHERE \N RES, ГАРДЫ ОСТАНУТСЯ ТАМ ЖЕ, ЭТО НЕ КУСОЧНАЯ ФУНКЦИЯ, БЛЯДЬ, RES WHERE RES ЭТО ТО ЖЕ САМОЕ, ЧТО IF X == TRUE THEN TRUE ELSE FALSE, БЛЯЯДЬ, КАК ЖЕ МНЕ ОТ ТЕБЯ БОМБИТ, СУКА БЛЯДЬ ПИЗДЕЦ, ААААААААА

Ответы107895

15 дек, 01:33 122 1107746

>>1107686
>Это чтобы мимокрокодилы не пугались от вида простыней на нерусском.
Ну, английский-то в х-ль-треде все, думаю, знают.

>"оценка аппликативного порядка" - классный термин по-моему, надо будет его рекомендовать всем
Ээ, лол, жестокий ты.

> А он есть в открытом доступе?
http://newstar.rinet.ru/~goga/sicp/sicp.pdf

> все что в таком же виде как функция объявляется
Ну так функция объявляется в виде f x = ..., а у тебя x = ...
Все функции принимают ровно один аргумент, ты это в типах видишь (стрелочки там не просто так).
p = p - это просто значение (как x = 42), но благодаря ленивости мы его можем определять рекурсивно в терминах самого себя. Например:
xs = [1] ++ xs -- бесконечный список: [1, 1, 1, ...]
take 3 xs -- из которого можно брать элементы: [1, 1, 1]

Ответы108110

15 дек, 01:38 123 1107750

>>1107688
>В итого сделал через лямбды
Чувак, но это же значит, что ты не понимаешь, как работает ленивость в х-ле - то есть как раз материал этой главы, понимание которого и призвано проверить данное упражнение.

Ответы107893

15 дек, 02:04 124 1107760

О г-ди, целый тред ебателей интов и флоатов через гланды в жопу. Извращенцы с нечитаемой хуйней негодной ни на что, кроме вычисление ряда фибоначи новым, необычным способом.

Ответы107894107948109426

15 дек, 12:02 125 1107893

>>1107750
>Чувак, но это же значит, что ты не понимаешь, как работает ленивость в х-ле

Возможно оно так и есть, навскидку, не обращаясь к LYAH (и игнорируя IO):

1. вся программа в хаскеле представляет собой цепочку вызовов функций, например map(fold(input_list)), только очень длинную

2. эта цепочка хаскель-рантаймом преобразуется в набор thunks (кусков (байт)кода в intermediate representation виде без входных параметров)

3. эти thunks рантайм расставляет в какой-то неочевидной последовательности (те, что не нужны для результата - выбрасывает) и далее выполняет 1 за другим

Это похоже на правду?

Ответы107948

15 дек, 12:06 126 1107894

>>1107760
Не, не только фибонначчи, еще и аккерман можно EJB писать, деплоить их на апп-сервера и считать фибоначчи через hadoop и не тормозить - https://github.com/typelead/eta

Ответы107948

15 дек, 12:15 127 1107895

>>1107743
Чистый, понятный и хорошо структурированный код же, что тебе не нравится, в Java все так делают - http://shitcode.net/135

Ответы107943

15 дек, 15:00 128 1107943

>>1107895
>Чистый, понятный и хорошо структурированный код
>Используется concrete класс
мы вам перезвоним

15 дек, 15:08 129 1107948

>>1107760
Тушись и возвращайся обратно в свой пхп-тред, дружочек :3

>>1107894
> foreign import java unsafe "@static java.lang.System.getenv"
> getEnv :: String -> IO (Maybe String)
Смищно. Ненужно. Скалка.

>>1107893
Ну, только не цепочка, а граф, и не вызовов функций, а сразу тханков, и вообще я намекал тебе на то, что раз ты оборачиваешь там выше аргументы к ифу в лямбды, то ты не понял, чем нормальный порядок от аппликативного отличается.

Ответы108110

15 дек, 21:08 130 1108110

>>1107948
> раз ты оборачиваешь там выше аргументы к ифу в лямбды, то ты не понял, чем нормальный порядок от аппликативного отличается

Код для этого примера писал несколько дней назад, с тех пор еще пару раз перечитал первую главу и стало вроде попрозрачнее.

Вроде как в нормальном порядке все выражение сразу раскрывается в дерево и потом снизу вверх вычисляется по нодам. И это какая-то теоретическая хрень, которую не использует никто.

А "оценка аппликативного порядка" - это примерно как в пролетарских ЯП - для каждого выражения сначала вычисляем его агументы по очереди, а затем к результатам применяем оператор.

Но вцелом - па-па-памедленнее, вот отсюда >>1107746 рекурсивность я пока еще не вкурил, и вообще эта ленивость пока тяжело воспринимается.

Ответы108404108406

16 дек, 17:19 131 1108404

>>1108110
> все выражение сразу раскрывается в дерево
При чем тут деревья какие-то, откуда ты это вообще взял? Аппликативный - при вызове вида (f x y z ...) сперва вычисляются x y z..., потом возвращается результат выражения. Нормальный - при вызове вида (f x y z ...) аргументы x y z... могут не вычислиться; сперва применяется f, а аргументы ей передаются "как есть", невычисленными. Вот и вся разница. Деревья там под капотом или не деревья - это уже зависит от реализации.

https://cs.stackexchange.com/questions/40758/difference-between-normal-order-and-applicative-order-evaluation
Scheme is an applicative-order language, namely, that all the arguments to Scheme procedures are evaluated when the procedure is applied. In contrast, normal-order languages delay evaluation of procedure arguments until the actual argument values are needed.

>И это какая-то теоретическая хрень, которую не использует никто.
> сам же пишет на хаскелле
Ну пиздец!

> "оценка аппликативного порядка"
Какая оценка, блядь? Аппликативный порядок выполнения (evaluation).

Ответы109195

16 дек, 17:48 132 1108406

>>1108110
>рекурсивность я пока еще не вкурил, и вообще эта ленивость пока тяжело воспринимается.
Рекурсивные значения - достаточно мозгоебная хрень, да. Тут как раз проще подумать о реализации (точнее некотором приближении того, как это может быть реализовано).

Грубо говоря, представь, что каждый top level definition у тебя создает граф, в котором ноды - это подвыражения в этом дефинишне. То есть как раз примерно то, о чем ты как раз читал в сикпе. И когда ты пишешь p = p, то это просто создает тривиальный граф, в котором только одна нода и только одно ребро, которое выходит из этой ноды и входит в эту же ноду. То есть простейший циклический граф. Соответственно, если ты используешь этот p в каком-то другом объявлении (которое тоже граф), то этот цикл подцепится и туда. Грубо говоря, если напишешь x = (+) 1 p, то у тебя будет граф с вершиной (+), от которой идут два ребра: одно - в вершину "1", а другое - в вершину "p", от которой идет ребро в саму себя. Вот нарисуй сейчас, со стрелочками. То есть получается, что, вычисляя все выражение (то есть следуя по стрелочкам), ты навсегда застрянешь в зацикленной вершине p.

А когда ты пишешь xs = [1] ++ xs, то цикл в графе, грубо говоря, "накачивает" вершину новыми значениями, но всегда оставляет то же самое (циклическое) ребро. То есть представь, что ты запустил в дебаггере выражение xs = [1] ++ xs и смотришь, как граф меняется с каждым шагом. Сперва у тебя в вершине [1], и ребро выходит из этой вершины и входит в нее же. На самом деле там не ребро, а подграф вида (++ [1] (++ [1] ...), который будет расти c каждым шагом - но мы для простоты считаем, что у нас умный рантайм, который на каждом шаге схлопывает этот подграф в одну вершину с циклом. Ты делаешь один шаг по стрелочке, приходишь опять в эту же вершину, но теперь в ней уже значение [1, 1]. Еще щаг - [1, 1, 1]. И так далее, можешь делать столько шагов, сколько хочешь - до конца оно никогда не вычислится, ибо это цикл в графе. А take 3 xs можешь считать как раз эдаким "пошаговым дебагером", который заходит в вершину xs, делает столько шагов, сколько указано в первом аргументе (то есть 3 шага), и потом возвращает то значение вершины, которое у нас получилось после этих шагов (уже без цикла!).

Как-то так, если грубо.

16 дек, 17:48 132 1108406

>>1108110
>рекурсивность я пока еще не вкурил, и вообще эта ленивость пока тяжело воспринимается.
Рекурсивные значения - достаточно мозгоебная хрень, да. Тут как раз проще подумать о реализации (точнее некотором приближении того, как это может быть реализовано).

Грубо говоря, представь, что каждый top level definition у тебя создает граф, в котором ноды - это подвыражения в этом дефинишне. То есть как раз примерно то, о чем ты как раз читал в сикпе. И когда ты пишешь p = p, то это просто создает тривиальный граф, в котором только одна нода и только одно ребро, которое выходит из этой ноды и входит в эту же ноду. То есть простейший циклический граф. Соответственно, если ты используешь этот p в каком-то другом объявлении (которое тоже граф), то этот цикл подцепится и туда. Грубо говоря, если напишешь x = (+) 1 p, то у тебя будет граф с вершиной (+), от которой идут два ребра: одно - в вершину "1", а другое - в вершину "p", от которой идет ребро в саму себя. Вот нарисуй сейчас, со стрелочками. То есть получается, что, вычисляя все выражение (то есть следуя по стрелочкам), ты навсегда застрянешь в зацикленной вершине p.

А когда ты пишешь xs = [1] ++ xs, то цикл в графе, грубо говоря, "накачивает" вершину новыми значениями, но всегда оставляет то же самое (циклическое) ребро. То есть представь, что ты запустил в дебаггере выражение xs = [1] ++ xs и смотришь, как граф меняется с каждым шагом. Сперва у тебя в вершине [1], и ребро выходит из этой вершины и входит в нее же. На самом деле там не ребро, а подграф вида (++ [1] (++ [1] ...), который будет расти c каждым шагом - но мы для простоты считаем, что у нас умный рантайм, который на каждом шаге схлопывает этот подграф в одну вершину с циклом. Ты делаешь один шаг по стрелочке, приходишь опять в эту же вершину, но теперь в ней уже значение [1, 1]. Еще щаг - [1, 1, 1]. И так далее, можешь делать столько шагов, сколько хочешь - до конца оно никогда не вычислится, ибо это цикл в графе. А take 3 xs можешь считать как раз эдаким "пошаговым дебагером", который заходит в вершину xs, делает столько шагов, сколько указано в первом аргументе (то есть 3 шага), и потом возвращает то значение вершины, которое у нас получилось после этих шагов (уже без цикла!).

Как-то так, если грубо.

Показать весь текст

18 дек, 15:09 133 1109195

>>1108404
Добра тебе, анон. Твоя ссылка заставила перечитать про порядок выполнения не только в SICP (где описание многословное и бестолковое), но и другие источники. В итоге все прояснилось после вот этой статьи из "википедии для олдфагов" - http://wiki.c2.com/?LazyEvaluation

аппликативный (пример: java) - аргументы вычисляются единожды перед вызовом

нормальный (пример: boost.preprocessor) - аргументы передаются в вызов невычисленными и вычисляются каждый раз, когда понадобятся

ленивый (пример: haskell) - аргументы передаются в вызов невычисленными, когда понадобятся - вычисляются единожды и запоминаются, при последующих обращениях используется запомненное значение

Сделал

git reset --hard >>1107686

и ушел решать заново пример про Алиссу П. Хакер

93 Кб, 750x545
18 дек, 23:32 134 1109387

Упражнение 1.6.

Лиза П. Хакер не понимает, почему if должна быть особой формой. «Почему нельзя просто определить ее как обычную процедуру с помощью cond?» — спрашивает она.
Лизина подруга Ева Лу Атор утверждает, что, разумеется, можно, и определяет новую версию if:

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))

Ева показывает Лизе новую программу:

(new-if (= 2 3) 0 5)
5
(new-if (= 1 1) 0 5)
0

Обрадованная Лиза переписывает через new-if программу вычисления квадратного корня:

(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))

Что получится, когда Лиза попытается использовать эту процедуру для вычисления квадратных
корней? Объясните.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.06.hs

haskell использует какую-то особую уличную магию ленивое вычисление и позволяет передать невычисленную рекурсивную функцию, возвращающую Float, в качестве Float параметра. В пролетарских языках в таком случае надо будет передавать замыкание и явно его вызывать где-нужно.

93 Кб, 750x545
18 дек, 23:32 134 1109387

Упражнение 1.6.

Лиза П. Хакер не понимает, почему if должна быть особой формой. «Почему нельзя просто определить ее как обычную процедуру с помощью cond?» — спрашивает она.
Лизина подруга Ева Лу Атор утверждает, что, разумеется, можно, и определяет новую версию if:

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))

Ева показывает Лизе новую программу:

(new-if (= 2 3) 0 5)
5
(new-if (= 1 1) 0 5)
0

Обрадованная Лиза переписывает через new-if программу вычисления квадратного корня:

(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))

Что получится, когда Лиза попытается использовать эту процедуру для вычисления квадратных
корней? Объясните.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.06.hs

haskell использует какую-то особую уличную магию ленивое вычисление и позволяет передать невычисленную рекурсивную функцию, возвращающую Float, в качестве Float параметра. В пролетарских языках в таком случае надо будет передавать замыкание и явно его вызывать где-нужно.

Показать весь текст
Ответы109396

19 дек, 00:12 135 1109396

>>1109387
> square1(guess)
Шта? Применение функции - f x, а не f(x). Скобки - только для группировки (изменения приоритета). То есть это то же, что и abs1(square1 guess - x) < 0.001. Со всеми скобками: (abs1 ((square1 guess) - x)) < 0.001
Минимальный набор: abs1 (square1 guess - x) < 0.001

В остальном - все ок.

Разве что еще можно настроить редактор, чтобы он выравнивал объявления:
| a >= 0 = a
| otherwise = (-a)
Макаба наверное проебет, но тыпонел.

Ответы109596

19 дек, 02:00 136 1109426

>>1107760
Ну если для тебя это новое и нечитаемое, желаю скорейшего заполнения пустот в знаниях, иначе стыдно называть себя программистом в 21 веке.

103 Кб, 300x298
19 дек, 05:11 137 1109455

>>1077271 (OP)
Объясните мне, зачем надо было вводить тайпклассы? SPJ не осилил старую-добрую перегрузку, как в C++? Нет, я правда не понимаю.

Ответы109474109575

19 дек, 05:14 138 1109457

>>1077273
Да потому что, блядь, нормальной модели рантайма нет. Только гуманитарные словоблудия, как у ван Россума в доке. f x y - и догадайся, мол, сама, во что эта хуйня выльется и сколлько тактов займет. Бесит!

Ответы250466250500

19 дек, 05:18 139 1109458

>>1107686
> "оценка аппликативного порядка" - классный термин по-моему
А как же КЛАСТЕРЫ МЕТАПАРАДИГМ? Хотя этим вроде лисперы баловались, у них-то язычок погибче будет.

19 дек, 06:48 140 1109474

>>1109455
>старую-добрую перегрузку, как в C++
ссаное говно потому что

без тайпклассов:
sum :: [a] -> a

с тайпклассами:
sum :: (Num a) => [a] -> a

смекаешь? По сигнатуре видно что sum работает не с любым a

Ответы109539

19 дек, 12:13 141 1109539

>>1109474
Так ведь если я подсуну ей [NonNum], она все равно не скомпилится, не? Ошибка только будет малопонятной. И ради понятной ошибки стоило отказываться от краткости кода? Или как?

Ответы109551

19 дек, 12:42 142 1109551

>>1109539
Ты действительно считаешь, что ограничение на тип влияет на краткость кода? То, что ты бы раньше писал в комментах ко входным параметрам функции (а если не писал, то вон из проффесии), теперь ты пишешь в сигнатуре.

Ответы109577

19 дек, 12:49 143 1109554

Есть хаскелл без кучи символов?

Ответы217577

19 дек, 14:56 144 1109575

>>1109455
https://en.wikipedia.org/wiki/Expression_problem
http://wiki.c2.com/?ExpressionProblem
http://homepages.inf.ed.ac.uk/wadler/topics/type-classes.html#class

http://learnyouahaskell.com/types-and-typeclasses
http://book.realworldhaskell.org/read/using-typeclasses.html

https://wiki.haskell.org/OOP_vs_type_classes
https://wiki.haskell.org/Typeclassopedia

Ответы109612

19 дек, 14:59 145 1109577

>>1109551
Верно и обратное. Теперь для любой перегрузки, для которой имя функции совпало чисто случайно, нужно писать тайпкласс:
[code]
get :: Form -> FieldID -> String
get :: Car -> ShowmeterID -> Float
[/code]
Либо писать префиксы (Form.get и Car.get). Либо отказываться от перегрузок вообще (привет lift, liftM, liftM2, liftM_ и т. д.).

Ответы109599109687

19 дек, 15:56 146 1109596

>>1109396
По скобкам - согласен, дальше поправлю. По отступам - свой супер-стабильный .vimrc не хочу трогать.

Упражнение 1.7.

Проверка good-enough?, которую мы использовали для вычисления квадратных корней, будет
довольно неэффективна для поиска квадратных корней от очень маленьких чисел. Кроме того, в
настоящих компьютерах арифметические операции почти всегда вычисляются с ограниченной точ-
ностью. Поэтому наш тест оказывается неадекватным и для очень больших чисел. Альтернативный
подход к реализации good-enough? состоит в том, чтобы следить, как от одной итерации к дру-
гой изменяется guess, и остановиться, когда изменение оказывается небольшой долей значения
приближения. Разработайте процедуру вычисления квадратного корня, которая использует такой
вариант проверки на завершение. Верно ли, что на больших и маленьких числах она работает
лучше?

https://github.com/functional-experiments/sicp/blob/master/exercise_1.07.hs

Этот пример не особо интересный, единственное в нем появляется сигнатура функции вот такая:

:: (Float -> Float -> Float -> Bool) -> Float -> Float -> Float -> Float

в которой явно не хватает уровней абстракции.

Ответы121006

19 дек, 16:14 147 1109599

>>1109577
> имя функции совпало чисто случайно
Н - неймспейсы.

Ответы109602

19 дек, 16:29 148 1109602

>>1109599
Не нужны. Мне, как правило, нужно оба неймспейса с одинаково называющимися функциями юзать.

Ответы109603

19 дек, 16:30 149 1109603

>>1109602
>Не нужны.
Пхп-тред вооон там.

> оба неймспейса с одинаково называющимися функциями юзать.
Подумой. Ты походу не понимаешь, что такое неймспейсы.

Ответы109606

19 дек, 16:35 150 1109606

>>1109603
Ну,вот тебе в продолжение моего предыдущего примера:

get :: Config -> FieldID -> String
get :: Car -> ShowmeterID -> Float

abruptBrake config car =
if get config "autobrakes" = true && get car "speed" > 120.0 then
brakeNahuy car
else
car

Ответы109607

19 дек, 16:39 151 1109607

>>1109606
И что это? Зачем ты постишь говнокод, который не скомпилируется?

Ответы109610

19 дек, 16:48 152 1109610

>>1109607
Тред читай. Вот тебе пример, где нужны две функции с не связанными друг с другом сигнатурами, но с одинаковым именем. Понятно, что он не компилируется, потому что и Car, и Config надо добавлять в тайпкласс Gettable where get :: .... Вопрос: нахрена так сделано, почему без тайпкласса нельзя?

Ответы109612

19 дек, 16:52 153 1109612

>>1109610
Ты какой-то долбоеб. Ты не понимаешь, что такое неймспесы. И что такое тайпклассы тоже не понимаешь. Про первое - гугли, про второе - выше ссылки >>1109575 запостили.

В твоем маняпримере вообще никакие функции не нужны, достаточно мапов или рекордов.

Ответы109621

19 дек, 17:00 154 1109621

>>1109612
Пространство имён (англ. namespace) — некоторое множество, под которым подразумевается модель, абстрактное хранилище или окружение, созданное для логической группировки уникальных идентификаторов (то есть имён).

> В твоем маняпримере вообще никакие функции не нужны, достаточно мапов или рекордов.
В моем маняпримере конфиг читается из флешки, где он прошит в бинарном виде, а показания показометров читаются из портов.

Ты так и будешь кичиться своими тайными знаниями новых, более лучших определений общеизвестных терминов или будешь по де съебешь уже из треда? Почему я в C++ могу написать вот такое (и при ошибках типизации оно даже будет корректно показывать, где ошибка), а в Хачки нет?

Ответы109622109626

19 дек, 17:01 155 1109622

>>1109621
*Зачем такмбыло сделано?

Ответы109626

19 дек, 17:10 156 1109626

>>1109621
Потому что С++ - это огромная куча говна, в которую понапихано все, что туда можно было понапихать, и которая дает тебе тысячу и один способ выстрелить себе в ногу, не? Мимокапитаночевидность, ага.

> конфиг читается из флешки, где он прошит в бинарном виде, а показания показометров читаются из портов.
То есть это две разных функции с разным поведением и разными контрактами. Разные сущности должны иметь разные имена. Для работы с уникальными именами умные человечки придумали неймспейсы. В чем твой вопрос?

Тайп-классы нужны для реализации тайп-сейф ад хок полиморфизма, решения експресьон проблем и создания абстракций - выше тебе ссылки дали. Опять же, в чем твой вопрос?

>>1109622
Зачем каждая функция не создает себе по тайп-классу, или что? Во-первых, смотри выше (в этом нет никакого смысла), во-вторых - скорее всего сломается вывод типов, в-третьих - это неочевидный и не запрашиваемый юзером рантайм оверхед. Опять же, в чем конкретно вопрос?

Ответы109662

19 дек, 18:54 157 1109662

>>1109626
> Разные сущности должны иметь разные имена.
Кому должны?

> Тайп-классы нужны для
похуй чего. Да, они позволяют более точно указывать типы, как в примере с sum, но мне это ни в хуй не вперлось сейчас.

> это неочевидный и не запрашиваемый юзером рантайм оверхед
Где ты там рантайм оверхед увидел? Это решается тупым нейм-манглингом.

> В чем твой вопрос?
Почему в Хаскеле запилили ад-хок полиморфизм, но не запилили никакого другого полиморфизма вообще ни в каком виде? В крестах и яве есть перегрузки, но нет ад-хок полиморфизма, как в Хаскеле. В Хаскеле - наоборот, есть ад-хок полиморфизм, но нет перегрузок. Почему нельзя было сделать произвольные перегрузки, а там, где программисту надо, он указывал бы еще и тайпклассы?

В естественных языках, кстати, есть оба вида полиморфизма (омонимы, контекст). Почему нельзя было сделать, как в инглише, например?

Или так: что плохого в неограниченном полиморфизме при наличии средств для ад-хок полиморфизма?

Так понятнее?

Ответы109674109771109777119583119961

19 дек, 20:09 158 1109674

>>1109662
Ты кокойто тупой.
Предлагаю тебе для начала осилить вооот эту страничку на википедии.
https://ru.wikipedia.org/wiki/Полиморфизм_(информатика)
Потом возвращаться в тред (лучше не надо).

19 дек, 21:07 159 1109687

>>1109577
В твоем примере нет полиморфизма вообще. Просто две разные функции с разными сигнатурами. А раз функции разные, то и называться они должны по-разному.

Ответы109771

20 дек, 00:29 160 1109771

>>1109687
См. >>1109662.
1. Кому должны?
2. Что, помимо (возможно) невнятных сообщениях об ошибках в других местах может произойти, если компилятор позволит их назвать одинаково?

Ответы119583

20 дек, 01:00 161 1109777

>>1109662
Ты какой-то тупой.

> Кому должны?
Хорошо, лично тебе разрешаю отныне обозначать символом "0" числа 0 и 1.

> похуй чего.
Дебил, я тебе объяснял, что такое тайп-классы, так как ссылки открыть у тебя мозгов не хватило. Впрочем, вижу, что зря.

> Где ты там рантайм оверхед увидел?
Дебил, речь про тайп-классы на каждую функцию. Ты же даже один абзац на русском прочитать не можешь.

> Почему в Хаскеле запилили ад-хок полиморфизм, но не запилили никакого другого полиморфизма вообще ни в каком виде?
Запилили, дебил ебаный. Какой же ты тупой.

> Почему нельзя
В прошлом посте объяснил, дебил. Перечитывай, пока не дойдет. Спойлер: никогда не дойдет.

> Почему нельзя было сделать, как в инглише
Какой же ты тупой. Иди делай свои лабы и не засоряй тред, пока не прочитаешь все данные тебе ссылки. Спойлер: никогда не прочитаешь, ты слишком тупой.

> Так понятнее?
Да. Все в этом треде поняли, какой ты дебил. Спасибо, до свидания.

Ответы109961

20 дек, 13:56 162 1109961

>>1109777
> Хорошо, лично тебе разрешаю отныне обозначать символом "0" числа 0 и 1.
Ты когда используешь метод доведения до абсурда, пооверяй хоть, что получается в итоге. Вспоминай, как работают перегрузки в Java. Там если две функции имеют неразличимые сигнатуры, компилятор ругается.

Ответы109968

140 Кб, 400x518
20 дек, 14:04 163 1109967

Короче, попробую сам написать тайпчекер. С параметрическим и ад-хок полиморфизмом.

20 дек, 14:04 164 1109968

>>1109961
>>> Разные сущности должны иметь разные имена.
>> Кому должны?
> Хорошо, лично тебе разрешаю отныне обозначать символом "0" числа 0 и 1.
Где ты тут видишь хоть слово про перегрузки в Джаве, дебил ебаный? Бери учебник по русскому языку и учись читать.

Ответы110099

20 дек, 18:31 165 1110099

>>1109968
https://ru.m.wikipedia.org/wiki/Контекст

Ответы110167

462 Кб, 811x768
20 дек, 20:37 166 1110167

>>1110099
> тыкнули его в то, что он потерял контекст
> кидает ссылку на статью "Контекст"

13 янв, 21:11 167 1119574

Почему работает negate (negate 3), но не negate -3 ?

Ответы119575

13 янв, 21:19 168 1119575

>>1119574
Потому что нельзя из функции вычитать число.

Ответы119918

13 янв, 21:42 169 1119583

>>1109771
1. Компилятору и коллеге-программисту.
2. Компилятор все равно будет вынужден декорировать функции, из-за чего будут страдать вообще все, как страдают пользователи плюсоводских блябляотек.

>>1109662
>Почему в Хаскеле запилили ад-хок полиморфизм, но не запилили никакого другого полиморфизма вообще ни в каком виде?
Параметрический полиморфизм ты за полиморфизм уже не считаешь?
А перегрузка - это самый что ни на есть адхок полиморфизм.

220 Кб, 750x414
14 янв, 15:54 170 1119879

А почему считается, что для профессионального программирования на Хаскеле нужно изучать теорию категорий? Ведь она объективно не нужна для этого дела. Ведь в языке нельзя даже какую-нибудь свою категорию определить.

Ответы119925120021

14 янв, 17:21 171 1119918

>>1119575
А я думал, что - это alias для negate, и вычитание числа из функции выглядело бы как (-3) negate, т.е. функция в даном случае (-3), а число - просто -3.

Ответы119919120019

14 янв, 17:22 172 1119919

>>1119918
> в данном случае

14 янв, 17:41 173 1119925

>>1119879
Потому что хаскель мемный язык.

14 янв, 19:31 174 1119961

>>1109662
Ad hoc = перегрузка.
Параметрический полиморфизм в этих языках — настолько базовая вещь, что даже не всегда вспоминается.

Отсутствует только третий вид сабтайп-полиморфизм из-за его сложности.

14 янв, 21:13 175 1120019

>>1119918
Минус в хаскеле на особом положении. (-3) - это синтаксический сахар для negate 3, а не частично примененный оператор (-).

14 янв, 21:17 176 1120021

>>1119879
Можно. Импортишь Control.Category и хоть обопределяйся.

Ответы120073

14 янв, 22:45 177 1120073

>>1120021
Смешная шутка.

60x32
16 янв, 23:46 178 1121006

>>1109596
Упражнение 1.8.

Метод Ньютона для кубических корней основан на том, что если y является приближением к
кубическому корню из x, то мы можем получить лучшее приближение по формуле (прикрилейтед).

С помощью этой формулы напишите процедуру вычисления кубического корня, подобную процедуре для квадратного корня.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.08.hs

Ответы121092

17 янв, 08:21 179 1121092

>>1121006
О, а я думал ты там умер уже. Добро пожаловать снова!

Ответы121543

18 янв, 02:11 180 1121543

>>1121092
Разгребал всякое г-но, что под н.г. накопилось - ынтырпрайз, он бессмысленный и беспощадный. Вроде разгреб, и можно дальше ерундой заниматься.

18 янв, 02:12 181 1121544

Упражнение 1.9.

Каждая из следующих двух процедур определяет способ сложения двух положительных целых
чисел с помощью процедур inc, которая добавляет к своему аргументу 1, и dec, которая отнимает
от своего аргумента 1.

(define (+ a b)
(if (= a 0)
b
(inc (+ (dec a) b))))

(define (+ a b)
(if (= a 0)
b
(+ (dec a) (inc b))))

Используя подстановочную модель, проиллюстрируйте процесс, порождаемый каждой из этих про-
цедур, вычислив (+ 4 5). Являются ли эти процессы итеративными или рекурсивными?

https://github.com/functional-experiments/sicp/blob/master/exercise_1.09.hs

Ответы121547

18 янв, 02:31 182 1121547

>>1121544
Эта совсем простое, но интереснее предыдущих. Очевидно, что в первом случае рекурсия не хвостовая (так как результат рекурсивного вызова не возвращается из функции) и стек будет пухнуть.

Описание этой фичи забавное:

> большинство реализаций обычных языков (включая Аду, Паскаль и Си) построены так,
> что интерпретация любой рекурсивной процедуры поглощает объем памяти, линейно рас-
> тущий пропорционально количеству вызовов процедуры, даже если описываемый ею про-
> цесс в принципе итеративен. Как следствие, эти языки способны описывать итеративные
> процессы только с помощью специальных«циклических конструкций» вроде do, repeat,
> until, for и while. Реализация Scheme, которую мы рассмотрим в главе 5, свободна
> от этого недостатка.

"Недостатка", лол, это типа быдлокодеры на пролетарских ЯП не умеют в функциях на 1000 строк, из которых 300 - HTML, 200 - SQL, 500 - недоязычок и 0 - комментарии влет определять, что рекурсия хвостовая, поэтому для них придумали for и while костыли. А если сделает рекурсию - то будет "медленна" на самом деле нет, рантайм все оптимизирует. А вот ФП-мастер-раса вписала себе тейл-рекурсию в стандарт и может свободно использовать.

Ответы121591

18 янв, 09:36 183 1121591

>>1121547
>будет "медленна" на самом деле нет, рантайм все оптимизирует
Шта? TCO не влияет на скорость, он влияет на сложность по памяти. Рантайм тут ни при чем.

Ответы121855122245

18 янв, 17:34 184 1121855

>>1121591
Если у тебя происходит алокация стека функции на каждую итерацию, вместо переиспользования, скорость тоже страдает. Если чтобы переделать в хвостовой вариант, нужно передать только число аргументом, это добавит скорости.

Ответы122803

19 янв, 04:17 185 1122242

Упражнение 1.10.

Следующая процедура вычисляет математическую функцию, называемую функцией Аккермана.

(define (A x y)
(cond ((= y 0)
((= x 0)
((= y 1)
(else (A
0)
(* 2 y))
2)
(- x 1)
(A x (- y 1))))))

Каковы значения следующих выражений?

(A 1 10)
(A 2 4)
(A 3 3)

Ответы122243

19 янв, 04:18 186 1122243

>>1122242

Рассмотрим следующие процедуры, где A — процедура, определенная выше:

(define (f n) (A 0 n))
(define (g n) (A 1 n))
(define (h n) (A 2 n))
(define (k n) (* 5 n n))

Дайте краткие математические определения функций, вычисляемых процедурами f, g и h для
положительных целых значений n. Например, (k n) вычисляет 5n2 .

https://github.com/functional-experiments/sicp/blob/master/exercise_1.10.hs

Ответы122244122809

52 Кб, 504x566
19 янв, 04:22 187 1122244

>>1122243
Сраный Аккерман, ненавижу этого еврея, на функции (h n) сломал мозг и подсмотрел ответ в решенияx.

Ответы122809

19 янв, 04:30 188 1122245

>>1121591
>Рантайм тут ни при чем.

Имелось ввиду, что рантайм Java/JS/PHP на этапе JIT-компиляции перепишет нахрен всю функцию если сумеет, заинлайнит втруху все что только можно и ТСО на простой цикл заменит но не гарантирует этого, так как не Схема

Ответы122246122809

19 янв, 04:33 189 1122246

>>1122245
:%s/ТСО/рекурсивные тейл коллы/g

118 Кб, 640x640
20 янв, 13:27 190 1122803

>>1121855
>хаскель-тред

20 янв, 13:37 191 1122809

>>1122243
> foldr (*) 1 [5, n, n]
Лол, до сих пор используешь списки там, где в оригинальном коде никаких списков нет.

>>1122244
Лол, жизненно, да.

>>1122245
Не знаю насчет пхп (лол), но ни jvm, ни js-рантаймы этого не делают. Не уверен, что это вообще возможно, так как изменяется семантика.

Ответы124055

22 янв, 03:47 192 1124055

>>1122809
> foldr нинужын

Точно, это от предыдущей версии осталось, надо поправить.

> cтек не растет - изменяется семантика

Вот хрен знает, эти рантаймы оче много магии содержат. Но пруфоссылок у меня нет. А вообще со стеком разные нехорошие вещи даже C++ разрешает делать (не напрямую связано, но идеи похожие - https://stackoverflow.com/q/47075871/314015 ).

Ответы124328

22 янв, 03:50 193 1124057

Упражнение 1.11.

Функция f определяется правилом:

f (n) = n, если n < 3,

и

f (n) = f (n − 1) + f (n − 2) + f (n − 3), если n ≥ 3.

Напишите процедуру, вычисляющую f с помощью рекурсивного процесса. Напишите процедуру, вычисляющую f с помощью итеративного процесса.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.11.hs

Ответы124059124328

22 янв, 03:55 194 1124059

>>1124057

Неожиданно подвис на итеративном варианте, оказывается если Фибоначчи сделать не из 2-х элементов, а из 3-х - то задача вдруг становится очень сложной для жабокодеров.

22 янв, 15:03 195 1124328

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

>>1124057
Лол, я сейчас немного подвис. В русском переводе нет коэффицентов 1,2,3 у вызовов f?

Ответы124709

23 янв, 02:55 196 1124709

>>1124328
> В русском переводе нет коэффицентов 1,2,3 у вызовов f?

Ага, точно, в русском переводе импортозаместили:

f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3)

на:

f (n) = f (n − 1) + f (n − 2) + f (n − 3)

77x100
23 янв, 03:00 197 1124710

Упражнение 1.12.

Приведенная на пикрилейтеде таблица называется треугольником Паскаля (Pascal’s triangle).

Все числа по краям треугольника равны 1, а каждое число внутри треугольника равно сумме двух чисел над ним . Напишите процедуру, вычисляющую элементы треугольника Паскаля с помощью
рекурсивного процесса.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.12.hs

Ответы124711

23 янв, 03:06 198 1124711

>>1124710

А вот этот пример мне понравился, узнал что для листов 100500 функций есть - https://hackage.haskell.org/package/base-4.10.1.0/docs/Data-List.html

И что листокомпрехеншены есть, прямо как в питоне.

Правда сначала написал решение, а потом прочитал, что нужен рекурсивный способ. Портить итеративный вариант на рекурсивный не стал.

Ответы124715

23 янв, 03:55 199 1124715

>>1124711
>И что листокомпрехеншены есть, прямо как в питоне.
Вообще-то это в питоне листокомпрехеншены есть, прямо как в сабже

24 янв, 03:13 200 1125314

Упражнение 1.13.

Докажите, что Fib(n) есть целое число, ближайшее к φn / 5, где φ = (1 + 5)/2. Указание: пусть ψ = (1 − 5)/2. С помощью
определения чисел Фибоначчи (см. раздел 1.2.2) и индукции
докажите, что Fib(n) = (φn − ψ n )/ 5.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.13.hs

Ответы125316129201

24 янв, 03:17 201 1125316

>>1125314

>Докажите

Ага, как же, не быдлокодерское это дело - теоремы доказывать.

Посчитал в примере для нескольких значений - и правда очень близкие результаты получаются.

Наличие в хаскеле 3-х разных операторов для возведение в степень вызвало некоторое удивление.

24 янв, 14:46 202 1125485

Вкатываюсь в функциональное программирование. Посоветуйте книжечки про ФП.

Ответы125526125688

24 янв, 16:43 203 1125526

>>1125485
sicp
http://learnyouahaskell.com/

24 янв, 21:55 204 1125688

>>1125485
Haskell From First Principles 2017 года

26 янв, 22:24 205 1126991

Только начал писать что-то более серьезное, нежели fib, и сразу же обосрался с этого хуцкеля. Вкратце: нужно генерировать бинарник с порядком байтов big endian. Ну хули, дело простое, ищу в base функции типа fwrite и hton*, или хотя бы что-то похожее. Знаете что я нахожу? - Ни-ху-я. Саймону это нахуй ненужно. Зачем вообще что-то выводить, ведь можно просто играться в анус чистыми функциями и впаривать это индусам из мелкомягких/книгалицо. Ладно, думаю, может это я такой долбоеб не нашел, поэтому гуглю данную проблему, и везде люди предлагают использовать сторонние либы от васянов, напомню, чтобы записать свапнутое число в бинарник. Нашел самую легковесную либу, линканул статически: плюс 31824 байтов к весу исходника. Дальше меня ожидает еще больший пиздец?
зы А ведь я до этого стирал шишку на этот язык.

Ответы127015127030127034

26 янв, 23:06 206 1127015

>>1126991
Байтоеб обезумел, сможешь ли ты совладать с ним?

Я надеюсь, что ты троллишь - в таком случае это тонко и остроумно, снимаю шляпу.

Ответы127057

26 янв, 23:21 207 1127030

>>1126991
А самому что-нибудь лёгкое написать никак?

Ответы127057

26 янв, 23:30 208 1127034

>>1126991
Какой конкретно тип данных нужно записать?

Проблема в том, что Haskell и тот же C - разные языки, для разных целей.
Если C работает с байтами (это грубо сказано, понимаю), то Haskell - с абстракциями вроде функций и монад. Языки для разного, так что не надо орать, что Haskell говно всего лишь из-за этого.

А так ответь на мой вопрос - постараюсь помочь.

Ответы127057127061

27 янв, 00:06 209 1127057

>>1127015
Я просто ебанулся и захотел на хуцкеле писать всё: небо, землю и даже аллаха. Но столкнулся с реальностью, о которой говорит >>1127034 и меня разворотило.
>>1127030
Как. Да только это ебля с битовыми сдвигами. В фп биты теребить, ты совсем черт?
>>1127034
Любой Word*, отличный от Word8, например.

Ответы127078

27 янв, 00:21 210 1127061

>>1127034
Пока вот такое решение:
import Data.ByteString.Builder (hPutBuilder, word32BE)

f :: Word32 -> IO
f = hPutBuilder stdout $ word32BE

Ответы127064

27 янв, 00:25 211 1127064

>>1127061
Фикс:
f :: Word32 -> IO ()
f = (hPutBuilder stdout) . word32BE

27 янв, 00:49 212 1127078

>>1127057
>Я просто ебанулся и захотел на хуцкеле писать всё
В этом нет ничего плохого, но ожидать от высокоуровнего языка функций для работы с байтоебством в стандартной библиотеке как-то глупо, не находишь?

Ответы127305

27 янв, 11:04 213 1127194

Лично моё мнение: Haskell для парсинга. Ну и для параллельных вычислений. Кто-нибудь может расширить список, я уверен, но это то, для чего я его использую.

Ответы127443

27 янв, 14:21 214 1127305

>>1127078
Глупо то что ты написал. А хорошая стандартная библиотека - это норм.

Ответы127443

27 янв, 17:16 215 1127443

>>1127305
По такой логике в хорошей стандартной библиотеке должен быть гуи-тулкит, хттп-сервер и rdbms. До свидания.

>>1127194
Компиляторы же!

27 янв, 17:57 216 1127459

Я еще только вкатываюсь, и не понял вот чего: тут что, типы не имеют типа Type, как в питоне? Или просто :t в ghci работает только на дата конструкторы?

Ответы127587221518

27 янв, 22:24 217 1127587

>>1127459
Type constructors или datatypes объявляются при помощи `data`. Алиасы - при помощи `type`. Через `:t` можно смотреть тип чего-угодно, кроме тайпклассов. Функции или value constructor-а например. Для typeclasses юзается `:info`

27 янв, 22:25 218 1127588

Пацаны, а кто-нибудь на работе кодит на хаскеле?

Ответы128068

27 янв, 22:32 219 1127591

Впервые за последние джва года зашел в /pr и внезапно увидел хаскель тред. В мое время такой хуйни не было. Язык хайпанул чтоль?

Ответы127603

27 янв, 23:00 220 1127603

>>1127591
Сейчас многие языки стремятся включить мощные абстракции ФП в стандарт: C++, Java и т. д. Также популярность возросла благодаря таким языкам, как Scala, Go и т. п.

Ответы135527

27 янв, 23:02 221 1127605

Анон, а почему бы не придумать Хаскелю маскота, вроде "Лямбда-тян"?
Понимаю, с такими идеями мне сразу в /b/ надо.

Ответы127687129198

28 янв, 01:17 222 1127687

>>1127605
Да вы заебали, в одном треде шлюха вниманиеблядит, в другом шмара в оп-посте, теперь еще и сюда эту хуйню ТЯН ТЯН ПИСЕЧКА ТЯН тащат, пиздец просто.

Ответы127698

28 янв, 01:39 223 1127698

>>1127687
Двачаю. Хаскель - серьезный язык для и серьезных умных людей и это не сарказм. Мы тут ерундой не занимаемся.

Ответы127772

28 янв, 01:45 224 1127701

Начинайте читать хаскелль с Haskell Programming: From First Principles . Воистину лучшая книга по хаскеллю для вкатывания.

Ответы128063

785 Кб, 1000x1300
28 янв, 06:52 225 1127772

>>1127698
Да.

28 янв, 10:44 226 1127816

Есть вообще приемлимый способ профилирования, если код использует стороннюю библиотеку? Там вроде надо cabal install $packagename --enable-library-profiling, но оно требует перестановки зависимостей, и в итоге все рушится!

Ответы129320

28 янв, 17:50 227 1128063

>>1127701
А чо в ней такого крутого? Чем лучше "во имя добра"? Реквестирую рецензию, короче.

Ответы128240128326

28 янв, 17:54 228 1128068

>>1127588
Зефирыч кодит.

Ответы128215

28 янв, 19:58 229 1128215

>>1128068
Хуй сосет губой трясет - он на крестах сейчас.

28 янв, 20:18 230 1128240

>>1128063
В отличие от "во имя добра", в ней тебя проводят в первую очередь по абстракциям - посмотри содержание, как там список глав выглядит. После объяснения идут упражнения в конце каждой главы - в них ты обращаешься с этими абстракциями на практике. Это, как мне кажется, более здравый взгляд на основу языка, которой являются именно эти самые абстракции, а не способ написания hello world.
От "во имя добра" у меня осталось впечатление, что я могу воспроизвести примеры, которые там есть, и вроде понимаю, как они работают, но как только я пытаюсь сконструировать из данной мне инфы что-то сложнее этих примеров - не могу, сразу начинаются ошибки и появляются вопросы, ответы на которые в книге найти трудно. Может, я просто тупой, но сейчас я радуюсь Haskell Programming From First Principles и чувствую, что я не тупой, а просто нихуя не знаю, но могу узнать.

Ответы128905129011

28 янв, 22:48 231 1128326

>>1128063
> Чем лучше "во имя добра"?
В воимядобра даже нет главы по монад трансформерам - одной из центральных фич.

29 янв, 22:38 232 1128905

>>1128240
Согласен с этим господином, даже нечего добавить.

48 Кб, 1124x347
29 янв, 22:59 233 1128934

Бля, вот нахуя они назвали объявление типа через "data", а алиасы через "type"? Пиздец же как путает потсоянно, что там data constructor, что там type, хуе-мое. Вот в элме все по-человечески, типы через "type", алиасы через "alias", нет такого уебанства и путаницы как в хаскили

Ответы129224

30 янв, 02:39 234 1129011

>>1128240
Естественно, то что это вторая (или больше) книга по хачкилю, значения не имеет.

Ответы129024

30 янв, 06:21 235 1129024

>>1129011
Без "то".

Ответы129139

30 янв, 13:20 236 1129139

>>1129024
Почему? Дай ссылку почитать.

Ответы129163

30 янв, 14:32 237 1129163

>>1129139
Ссылку на грамматическую норму?
Вот тебе цитата из учебника.

Если относительное слово относится ко всей главной части, а не отдельному её члену, то в главной части не может быть указательного слова, например: Мать очень беспокоилась об отце, что и во мне возбудило беспокойство.

Кроме того, указательное слово - в главном предложении, а не в придаточном.

30 янв, 15:42 238 1129198

>>1127605
Какая нахрен тян, есть же идеальный маскот - Гопник Хаскель - и придумывать ничего не надо.

https://ru.wikipedia.org/wiki/Гопник,_Хаскель_Моисеевич

Ответы129226

136 Кб, 640x1542
30 янв, 15:49 239 1129201

>>1125314

Упражнение 1.14.

Нарисуйте дерево, иллюстрирующее процесс, который порождается процедурой count-change из раздела 1.2.2 при размене 11 центов. Каковы порядки роста памяти и числа шагов, используемых этим процессом при увеличении суммы, которую требуется разменять?

https://github.com/functional-experiments/sicp/blob/master/exercise_1.14.hs

Пикрилейтед из гугла, совпадает с ascii-art'ом из решения.

Ответы130921

30 янв, 16:31 240 1129224

>>1128934
Логика в этом есть. type объявляет только тип, а data - все соответствующие структуры. Ну и у тебя даже на картинке написано: datatype declaration. Логично же?

32 Кб, 179x254
30 янв, 16:33 241 1129226

>>1129198
>Хаскель Моисеевич Гопник
>Хаскель Гопник
>Моисеевич
Сука, он еще и хохол! Блядь, я не могу, в этом человеке идеально все.

Хаскель Гопник смотрит на тебя с интересом и некоторой иронией.

Ответы145755

30 янв, 19:26 242 1129320

>>1127816
надо снести сэндбокс и переставить все заново

ну или stack возьми

30 янв, 22:04 243 1129370

>> 1129320
Спасибо, попробую stack

148x26
2 фев, 21:13 244 1130921

>>1129201

Упражнение 1.15.

Синус угла (заданного в радианах) можно вычислить, если воспользоваться приближением sin x ≈ x при малых x и употребить тригонометрическое тождество (пикрилейтед) для уменьшения значения аргумента sin. (В этом упражнении мы будем считать, что угол «достаточно мал», если он не больше 0.1 радиана.) Эта идея используется в следующих процедурах:
(define (cube x) ( x x x))
(define (p x) (- ( 3 x) (* 4 (cube x))))
(define (sine angle)
(if (not (> (abs angle) 0.1))
angle
(p (sine (/ angle 3.0)))))

а. Сколько раз вызывается процедура p при вычислении (sine 12.15)?

б. Каковы порядки роста в терминах количества шагов и используемой памяти (как функция a)
для процесса, порождаемого процедурой sine при вычислении (sine a)?

https://github.com/functional-experiments/sicp/blob/master/exercise_1.15.hs

Ответы130924132929

2 фев, 21:16 245 1130924

>>1130921

Для вопроса (а) добавил счетчик числа вызовов в саму функцию - со всеми ленивостями так просто логирование не добавить. Вообще этот момент - запрет на console.log() из нормальных функций - достаточно сильно мешает.

Для (б) - поленился считать, там какой-то неочевидный полином получался.

Ответы131234

3 фев, 13:42 246 1131234

>>1130924
>запрет на console.log()
Тащем-то как раз в таких случаях можно использовать unsafePerformIO.

Ответы131252

3 фев, 14:24 247 1131252

>>1131234
Debug.Trace

Ответы132934

5 фев, 16:37 248 1132929

>>1130921

Упражнение 1.16.

Напишите процедуру, которая развивается в виде итеративного процесса и реализует возведение в степень за логарифмическое число шагов, как fast-expt. (Указание: используя наблюдение, что (bn/2 )2 = (b2 )n/2 , храните, помимо значения степени n и основания b, дополнительную переменную состояния a, и определите переход между состояниями так, чтобы произведение abn от шага к
шагу не менялось. Вначале значение a берется равным 1, а ответ получается как значение a в момент окончания процесса. В общем случае метод определения инварианта (invariant quantity), который не изменяется при переходе между шагами, является мощным способом размышления о построении итеративных алгоритмов.)

https://github.com/functional-experiments/sicp/blob/master/exercise_1.16.hs

Ответы132934133415

5 фев, 16:40 249 1132934

>>1132929

Вот этот пример мне понравился, несложный, но заставляет немного подумать.

>>1131252

Эта штука выглядит полезной, особенно если добавить фокус с flip вот отсюда

6 фев, 13:25 250 1133415

>>1132929

Упражнение 1.17.

Алгоритмы возведения в степень из этого раздела основаны на повторяющемся умножении. Подоб-
ным же образом можно производить умножение с помощью повторяющегося сложения. Следующая
процедура умножения (в которой предполагается, что наш язык способен только складывать, но
не умножать) аналогична процедуре expt:
(define ( a b)
(if (= b 0)
0
(+ a ( a (- b 1)))))
Этот алгоритм затрачивает количество шагов, линейно пропорциональное b. Предположим теперь,
что, наряду со сложением, у нас есть операции double, которая удваивает целое число, и halve,
которая делит (четное) число на 2. Используя их, напишите процедуру, аналогичную fast-expt,
которая затрачивает логарифмическое число шагов.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.17.hs

Ответы134063

7 фев, 14:26 251 1134063

>>1133415

Упражнение 1.18.

Используя результаты упражнений 1.16 и 1.17, разработайте процедуру, которая порождает итера-
тивный процесс для умножения двух чисел с помощью сложения, удвоения и деления пополам, и
затрачивает логарифмическое число шагов.

https://github.com/functional-experiments/sicp/blob/master/exercise_1.18.hs

Ответы144246

9 фев, 19:25 252 1135527

>>1127603
А причем здесь Go?

22 фев, 15:42 253 1144246

>>1134063
Как успехи? Опять на работе интерпрайс разгребаешь?

25 фев, 14:36 254 1145755

>>1129226
>Моисеевич
>хохол

8 мар, 18:55 255 1151722

Какой лучший способ реализовать очередь в ФП?

Ответы151733

8 мар, 19:08 256 1151733

>>1151722
С одной стороны вектор, с другой - список.

Ответы153351

11 мар, 09:36 257 1153351

>>1151733
Почему вектор а не список?

Ответы153579

11 мар, 16:03 258 1153579

>>1153351
Потому что reverse надо делать. Ну и элементы в списке и векторе добавляются с разных сторон, так что чисто визуально удобнее, если ты просто свою очередь просто как пару определишь.

Ответы153604

11 мар, 16:22 259 1153604

>>1153579
>Потому что reverse надо делать
А как делать без reverse?
>элементы в списке и векторе добавляются с разных сторон
Это я не понял.

Ответы162601162602

25 мар, 19:25 260 1162601

>>1153604
Я, конечно, встрял посреди беседы, но, видимо, здесь идёт речь про конструкцию списков.
Список может иметь только ДВА значения: [] или элемент : список. Т. е. список [1, 2, 3] - не что иное, как 1 : (2 : (3 :[])) (учитывая ассоциативность 1 : 2 : 3 : []). Соответственно, быстрее добавить элемент в начало, чем в конец. reverse же предлагается затем, чтобы хранить начало как конец, т. е. хранить список наоборот. Тогда добавление в конец будет являться, по сути, добавлением в начало. Потом превращаем это в список с помощью reverse. Вот, постарался объяснить.

25 мар, 19:26 261 1162602

>>1153604
Я, конечно, встрял посреди беседы, но, видимо, здесь идёт речь про конструкцию списков.
Список может иметь только ДВА значения: [] или элемент : список. Т. е. список [1, 2, 3] - не что иное, как 1 : (2 : (3 :[])) (учитывая ассоциативность 1 : 2 : 3 : []). Соответственно, быстрее добавить элемент в начало, чем в конец. reverse же предлагается затем, чтобы хранить начало как конец, т. е. хранить список наоборот. Тогда добавление в конец будет являться, по сути, добавлением в начало. Потом превращаем это в список с помощью reverse. Вот, постарался объяснить.

26 мар, 22:40 262 1163171

>>1077271 (OP)
В чём профит хаскелля? Кроме оригинального (тм) мышления
И какая основная область применения?

Ответы163189163786

26 мар, 23:38 263 1163189

>>1163171
людям он нравится за то что сам язык очень маленький и узконаправленный, без попытки объять необъятное и впихнуть невпихуемое. По сути он представляет один основной инструмент - функциональное программирование, который можно задрачивать до бесконечности, потому что инструмент позволяет изъёбываться через 4 пизды и восемь жоп. В то же время людям нравится что не надо отвлекаться на что то лишнее, так как в языке этого нет. Многим импанирует такой подход. Область применения, я думаю это просто игрушка для мозга, которая к тому же позволяет писать некоторые полезные тулзы в купе с чем либо еще, и дающее отдых уставшему от многообразия и лагающей еботни анону.

Ответы164402

27 мар, 23:26 264 1163786

>>1163171
Могу сказать за типизированные функциональные языки в целом: их преимущество в том, что намного легче читать код и рассуждать о корректности, потому что программа напоминает последовательность вычислений как в математике. Это, например, актуально для конкаренси, потому что при написании конкурентного кода возникают хитровыебанные ошибки, которые очень тяжело найти и воспроизвести. Никакие индусские говнометодологии типа TDD, BDD и прочего не помогут, если говнокодить при написании конкаренси, единственный выход - писать нормальный код и доказывать его коррекность. Обычно это не формальное доказательство, а просто пристальное разглядывание кода и доказательство в уме. Но можно заморочиться и провести полностью формальное доказательство корректности того или иного участка кода, записать доказательство в каком-нибудь пруф асистанте типа Coq. Функциональные языки хороши тем, что доказывать корректность кода на них намного легче чем на императивных.

Ответы163789164402

27 мар, 23:28 265 1163789

>>1163786
>Функциональные языки хороши тем, что доказывать корректность кода на них намного легче чем на императивных.
Дополню тебя: функциональные языки хороши тем, что писать корректный код на них намного легче чем на императивных.

Ответы164176164402

28 мар, 20:20 266 1164176

>>1163789
Ну тут уже от задачи зависит. Например, когда нужно изменяемое состояние и сайд эффекты, то нихуя не проще. Обычные изменяемые переменные использовать проще чем монаду стэйт.

Ответы164190164197164402

sage 28 мар, 20:32 267 1164190

>>1164176
ST или STM, но никак не State. И свои сайд эффекты можешь просто в IO хуячить, никто не запрещает.

Ответы164402

28 мар, 20:40 268 1164197

>>1164176
>изменяемое состояние
Что это? Дай вменяемое определение и поймёшь, что либо это не зависит от подхода ФП/не-ФП, либо не имеет смысла.
>сайд эффекты
А какие тут проблемы?

Ответы164207164349164402

28 мар, 20:55 269 1164207

>>1164197
> изменяемое состояние
> что это
Это когда одно и то же выражение может дать разные результаты в зависимости от времени. Например, выражение, которое получает элемент из мутабельной структуры данных.

Ответы164215164402164430

28 мар, 21:01 270 1164215

>>1164207
Алсо, функциональные структуры данных иногда намного менее очевидны в реализации, чем их императивные аналоги. Про них нужно отдельную книгу читать типа Криса Окасаки.

Ответы164402

28 мар, 23:51 271 1164349

>>1164197
>>сайд эффекты
>А какие тут проблемы?
Попробуй потоньше.

Ответы164402164431

29 мар, 01:48 272 1164402

>>1164349
>>1164215
>>1164207
>>1164197
>>1164190
>>1164176
>>1163789
>>1163786
>>1163189

ИТТ петушки, которые на хаскеле никогда не писали

29 мар, 07:06 273 1164430

>>1164207
Ну так а что это?

Ответы164641

29 мар, 07:07 274 1164431

>>1164349
Как тоньше? Я прямо спрашиваю.

Ответы164641

29 мар, 17:16 275 1164641

>>1164431
>>1164430
Все уже поняли, что ты жирный, можешь не продолжать.

29 мар, 21:29 276 1164781

Зачем нужен хаскелль, когда есть такой-то оверблюд с такими-то модулями и конпелятором, который в 100500 раз быстрее гэхэцэ?

Ответы164825164828

29 мар, 22:10 277 1164825

>>1164781
Чтобы писать диссеры и пейперы. Х-ль - чистый и красивый, верблюд - нет. Разные категории.

29 мар, 22:14 278 1164828

>>1164781
Например, там мультитрединга нормального нет.

Ответы164840

29 мар, 22:35 279 1164840

>>1164828
Уже есть почти скоро будет бля реально отвечаю

12 апр, 19:33 280 1172509

Посоны, а есть у кого The Implementation of Functional Programming Languages в нормальном качестве? Бесит этот мутный шрифт, блин.

12 апр, 23:01 281 1172619

>>1077271 (OP)
https://www.reddit.com/r/haskell/comments/8bofby/unplanned_hackage_downtime/ лол кек, ждем прохладную

14 апр, 00:03 282 1173300

Ну и как там 2020?

ПЛАНИРУЕТЕ
@
ПРЕДВКУШАЕТЕ?

Ответы173527

14 апр, 00:06 283 1173303

http://taylor.fausak.me/2017/11/15/2017-state-of-haskell-survey-results/

19 Кб, 200x218
14 апр, 14:11 284 1173527

>>1173300
Ага, уже вот-вот!

Ответы173632

14 апр, 16:34 285 1173632

>>1173527
Ага, да, ага https://github.com/haskell/rfcs/projects/1

66 Кб, 1084x871
30 апр, 08:20 286 1181936

Manning выпустил книженцию.

Ответы182193

30 апр, 19:47 287 1182193

>>1181936
Как то не уверен что она стоит покупки или даже пиратства.

4 мая, 23:48 288 1184360

антоны каким рехепх модулем пользуетесь?
что за недоразвитая таблица на оф сайте

Ответы184423

5 мая, 03:25 289 1184423

>>1184360
>рехепх
что?

Ответы184935

6 мая, 07:01 290 1184935

>>1184423
regular expression

Ответы185459

6 мая, 23:38 291 1185459

>>1184935
пользуюсь комбинаторами парсеров, брат жив
regexp забыл как страшный сон

9 мая, 14:09 292 1186828

Я чё-то не врублюсь в эти монады, помогите мне пожалуйста!

Ответы186924186958188221223383223561

9 мая, 16:03 293 1186924

>>1186828
Для начала пойми, монада - это такой моноид (множество с ассоциативной бинарной операцией и нейтралным элементом).

9 мая, 16:56 294 1186958

>>1186828
А что именно непонятно?

35 Кб, 970x731
11 мая, 13:28 295 1188221

>>1186828
Вот эти слайды посмотри, так общую идею уловишь - http://rgho.st/6c9JcSMRF

Ответы223561

20 мая, 04:26 296 1193043

что-то устал читать решил посмотрел лекцию и не понял одного момента
https://pastebin.com/raw/sFJUDJ3M
зачем там этот аккумулятор?? просто для аналогии с императивными?
или я чего-то не понимаю?

Ответы193127193806

20 мая, 12:23 297 1193127

>>1193043
Вызов функции занимает место в стеке, аккумулятор позволяет не забивать его попусту.

21 мая, 02:49 298 1193806

>>1193043
Заменяется вредная рекурсия на безопасную хвостовую.

22 мая, 00:58 299 1194449

Делаю задания по Хаскелю по ссылке, предложенной выше.
Прошу обоссывать.
>Simple, given a string of words, return the length of the shortest word(s).

>String will never be empty and you do not need to account for different data types.

module FindShortest where
find_shortest :: String -> Integer
find_shortest (x : xs) = fs_helper xs x 0 0

fs_helper :: [Char] -> Char -> Integer -> Integer -> Integer

fs_helper [] _ word_counter shortest
| shortest == 0 = (word_counter + 1)
| word_counter < shortest = (word_counter + 1)
| otherwise = shortest

fs_helper (argc2 : argstr) ' ' word_counter shortest
| shortest == 0 =
fs_helper argstr argc2 0 word_counter
| word_counter < shortest =
fs_helper argstr argc2 0 word_counter
| otherwise =
fs_helper argstr argc2 0 shortest

fs_helper (argc2 : argstr) _ word_counter shortest =
fs_helper argstr argc2 (word_counter + 1) shortest

22 мая, 00:58 299 1194449

Делаю задания по Хаскелю по ссылке, предложенной выше.
Прошу обоссывать.
>Simple, given a string of words, return the length of the shortest word(s).

>String will never be empty and you do not need to account for different data types.

module FindShortest where
find_shortest :: String -> Integer
find_shortest (x : xs) = fs_helper xs x 0 0

fs_helper :: [Char] -> Char -> Integer -> Integer -> Integer

fs_helper [] _ word_counter shortest
| shortest == 0 = (word_counter + 1)
| word_counter < shortest = (word_counter + 1)
| otherwise = shortest

fs_helper (argc2 : argstr) ' ' word_counter shortest
| shortest == 0 =
fs_helper argstr argc2 0 word_counter
| word_counter < shortest =
fs_helper argstr argc2 0 word_counter
| otherwise =
fs_helper argstr argc2 0 shortest

fs_helper (argc2 : argstr) _ word_counter shortest =
fs_helper argstr argc2 (word_counter + 1) shortest

Показать весь текст
Ответы194591

22 мая, 11:19 300 1194591

>>1194449
Не разбирал простыню кода, но вот к чему ты должен стремиться:
shortest :: String -> Int
shortest = minimum . fmap length . words

Разделять идентификаторы в хуцкеле подчеркиванием - это моветон, как по мне. Именования переменных вообще пиздец.

Ответы194634194740

22 мая, 12:44 301 1194634

>>1194591
Удваиваю. Этот хаскеллист кое-что смыслит.

22 мая, 14:40 302 1194740

>>1194591
>Разделять идентификаторы в хуцкеле подчеркиванием
Не виноватая я, так на сайте было.
>Именования переменных
А как надо?

Где можно почитать список функций типа words, length?

Ответы194817

214 Кб, 1530x1980
22 мая, 16:52 303 1194817

>>1194740
> А как надо?
Если пишешь код и потом им себе анус щекочешь, то как угодно. Если выставляешь на обозрение одному человеку и более, то, как минимум, осмысленнее и при этом как можно короче без потери смысловой нагрузки, а не argxyi7/argstr1/best_wrod_counter_in_the_world. Если один/два параметра у функции, зачастую просто x, y или первые буквы полного имени, так как при чтении такой функции не сложно держать в голове информацию о них.

Но это всего лишь придирки, ведь самый пиздец в том, что ты задание не так понял, функция выполняет не то, что нужно.

>Где можно почитать список функций типа words, length?
google: haskell prelude
google: haskell basic libraries

Советую начать учить хуцкель с пикрила. Чтиво не из легких, но зато минимум воды, прям от корки до корки ебашь.

Ответы194888

22 мая, 18:32 304 1194888

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

Ответы194943

22 мая, 19:11 305 1194943

>>1194888
> у меня система приняла
Да, я обосрался. Уверен был, что
> = (word_counter + 1)
возвращает позицию наименьшего слова, исходя из названия. letter_counter тогда уж, лол.

67 Кб, 711x1620
22 июня, 01:36 306 1214960

Отрыл шахту с изумрудами.

Ответы217789218334

26 июня, 10:49 307 1217577

>>1109554
https://github.com/barbuz/Husk

26 июня, 19:39 308 1217789

>>1214960
>Packt
С говном

27 июня, 16:01 309 1218334

>>1214960
http://haskellbook.com/

1 июля, 14:10 310 1220715

Сап, в ваш Хаскель вкатываться, если интересует числодробление? Именно реализация мат. части в ЯП.
Слышал, что математики любят функциональное программирование, которое к тому же помогает параллелить, ибо устраняет зависимости между данными.

Ответы220735220952221162

1 июля, 15:01 311 1220735

>>1220715
Тащем-то производительные числодробилки подразумевают байтоебство. А если тебе именно в плане покодить то, что изучаешь - да, самое то.

1 июля, 20:45 312 1220947

Ну-ка хачелисты, поясните, где я проебался.

Это работает: https://ideone.com/ADh9bm
А тут нет: https://ideone.com/9Q3bDr

Ответы221328

2 Кб, 198x34
1 июля, 21:01 313 1220952

>>1220715
Толстишь
Это говно даже 0.1 на 0.1 умножить не может

Ответы221053

2 июля, 00:14 314 1221053

>>1220952
Клован https://en.wikipedia.org/wiki/IEEE_754

2 июля, 11:55 315 1221162

>>1220715
>числодробление
Тут два пути.
1) По хардкору используешь FORTRAN, пишешь всё сам
2) По хардкору используешь всякие BLAS и LAPACK, которые сами были написаны в фортране, но через обёртки в плюсах или питоне.

2 июля, 17:50 316 1221328

>>1220947
Короче работать только с подсказками типов, неТруЪ как-то: https://ideone.com/FhZWsA

Ответы221754

2 июля, 21:55 317 1221518

>>1127459
Типы и в питоне не всегда тип `type` имеют. Это стандартный метакласс, и его можно переопределить.

Проблема тут в том что у `type` самого тип `type` и возникает порочный круг, который мешает каким-то хорошим свойствам теории типов.

Поэтому в Haskell типы-типов называются `kind` и у они все что обычные типы умеют. Подробности гугли, я не очень разбираюсь в вопросе. Полноценные бесконечные иерархии типов есть в языках с зависимыми типами, типа Coq и Idris.

Пример:

```
Prelude> :k Int
Int :: *
```

Ответы221521

2 июля, 21:56 318 1221521

>>1221518
https://wiki.haskell.org/Kind

3 июля, 11:29 319 1221754

>>1221328
Ну а хули ты хотел? У тебя тип a должен стать неким m b. Откуда компилятору знать что ты там имел ввиду под b?

Вот тебе более простой аналогичный случай:

main = print $ read "5"

Ответы222853223735223746

3 июля, 14:10 320 1221850

Prelude Data.Scientific> x = 1 :: Scientific
Prelude Data.Scientific> x / 7
^CInterrupted.
Prelude Data.Scientific> (x / 7) 7
^CInterrupted.
Prelude Data.Scientific> x 7 / 7
1.0

Че делать? Расходимость так и прёт.

5 июля, 06:39 321 1222853

>>1221754
какие же компиляторы тупые пиздец просто

Ответы223389

154 Кб, 1280x1268
5 июля, 22:02 322 1223253

>>1077271 (OP)

Ответы224276

6 июля, 07:04 323 1223383

>>1186828
Монада - это моноид из категории эндофункторов.

6 июля, 08:13 324 1223389

>>1222853
Вернись в /по/рашу.

6 июля, 13:56 325 1223561

>>1186828
Монада M это тайп констрактор. Берёшь M, тип a, и получаешь тип M a, у которого есть байнд (>>= :: M a -> (a -> M b) -> M b), ретёрн (return :: a -> M a) и который подчиняется паре простых законов. Всё остальное лишь свистоперделки, которые можно получить из этих двух функций.
Вообще >>1188221 годную вещь указал, почитай: https://fsharpforfunandprofit.com/rop/

6 июля, 19:00 326 1223735

>>1221754
Какой-то хуёвый пример, с read всё понятно, его реализации имеют кучи типов. Во что парсить строку он не может понять.

Однако тут компилятор не может воткнуть, какой тип monadConcat возвращается при известном типе аргумента.
Хотя функция для этого типа аргумента всегда ОДНА, так как типы ([Int] и [[[int]]]) имплементирует по одной монаде, тут не может быть никакой двоякости.
Никакой другой тип результата невозможен для данного аргумента, поэтому описание типа результата избыточно, однако компилятор тупит.
Если туплю я, то какой тип кроме [Int] подойдёт для result1/result2?
Для лучшего примера. https://ideone.com/8P3ETU

Ответы225389236775

6 июля, 19:14 327 1223746

>>1221754
>У тебя тип a должен стать неким m b. Откуда компилятору знать что ты там имел ввиду под b?
Вот смотри, есть 2 варианта реализации monadConcat:

1) a ~ b. Должен срабатывать, если у меня входной аргумент не вложенный список ([[]]). Из этого кейса тип результат вычисляется, как тип аргумента.

2) Если же входной аргумент вложенный список, то рекурсивно проверяем тип результата повторным вызовом monadConcat, до тех пор, пока не придём к пункту 1.

Вот нахуй тут подсказывать компилятору тип результата?

Ответы225166

141 Кб, 857x1200
7 июля, 22:22 328 1224276

>>1223253

Ответы224917225321226991

12 Кб, 312x334
9 июля, 09:35 329 1224917

>>1224276

9 июля, 18:40 330 1225166

>>1223746
>1) a ~ b. Должен срабатывать, если у меня входной аргумент не вложенный список ([[]]). Из этого кейса тип результат вычисляется, как тип аргумента.
Нихуя. Нет ограничения на то, что a не может быть вложенным списком. Так что, a может быть чем угодно. И вложенным списком, и хуем в пизде. Из-за этого и неоднозначность.

Ответы225222225224

9 июля, 20:40 331 1225222

>>1225166
>Нихуя. Нет ограничения на то, что a не может быть вложенным списком. Так что, a может быть чем угодно. И вложенным списком, и хуем в пизде. Из-за этого и неоднозначность.
Если это вложенный список, то должен обрабатываться "instance (Monad m, MonadConcat m (m a) b) => MonadConcat m (m (m a)) b".

Это же блядь по сути паттерн-матчинг, только для системы типов. Все 100% кейсов логически раскладываются в 2 инстанса. Схуяли так тупо то?

9 июля, 20:42 332 1225224

>>1225166
>Нет ограничения на то, что a не может быть вложенным списком.
Ну ок, компилятору можно подсказать, что ЭТО НЕ МОЖЕТ БЫТЬ вложенной монадой? Т.е. по сути нужно логическое отрицание "MonadConcat m (m a) b".

9 июля, 23:17 333 1225321

>>1224276
>a как ∂
Ну что за почерк

10 июля, 02:14 334 1225389

>>1223735
> https://ideone.com/8P3ETU
>>1223735
>так как типы ([Int] и [[[int]]]) имплементирует по одной монаде
Ты что на хаскеле, что на русском пишешь какую-то хуйню, которую трудно и, порой, невозможно корректно распарсить.
Протрезвей и напиши ещё раз свой вопрос.

11 июля, 18:50 335 1226218

Почему ghci не жрет простую функцию типов?
sum' [x] = x
sum' (x:xs) = x + sum' xs
Без sum' :: [Int] -> Int выдает нон еххаустиве паттернс
С определением работает

Ответы226222226435

11 июля, 18:56 336 1226222

>>1226218
Попробуй вызвать свою функцию от пустого списка и поймёшь в чём суть.

12 июля, 00:20 337 1226435

>>1226218
Используй моноид Sum и не епи себе моск.

159 Кб, 911x1199
13 июля, 00:06 338 1226991

>>1224276

24 июля, 15:46 339 1234184

Обнаружена вакансия программиста на Haskell http://getshop.tv/ourteam/sr-haskell-developer/
https://hh.ru/vacancy/26915246

52 Кб, 600x450
27 июля, 01:13 340 1235921

28 июля, 15:24 341 1236775

>>1223735
Я точно не знаю, но думаю, что идея в следующем.

Haskell старается соблюдать принцип того, что добавление новых деклараций не должно ломать старый код. А в данном случае, если ты добавишь новых инстансов, то однозначность нахождения реалиции нарушится.

2 авг, 01:41 342 1239410

Сап, хаскеллач.
Подскажи, пожалуйста, как называется паттерн, суть которого состоит в последовательном применении такий функций, как map, filter, reduce. Напрочь вылетело из головы.
Stream API из джавы так же является реализацией данного паттерна.

Ответы239429239501239622239636

2 авг, 03:19 343 1239429

>>1239410
Это паттерн Вызов функций. Ну у тебя есть функция, и ты ее вызываешь. А если хочешь вызвать сразу несколько, то используешь композицию. паттерн блять, лол
Откуда это желание усложнять? Какой нахуй паттерн?

Ответы239636

2 авг, 11:01 344 1239501

>>1239410
https://en.wikipedia.org/wiki/Method_chaining

2 авг, 15:34 345 1239622

>>1239410
producer/consumer pattern

Баззворды собираешь?

2 авг, 15:53 346 1239636

>>1239410
Т Р А Н С Д Ь Ю С Е Р Ы

а по делу, этот >>1239429 прав
но есть (в том числе в хаскеле) довольно много реализаций апи над коллекциями\стримами\етк
помимо трандьюсеров, есть еще обычные итераторы\сиквенсы, есть iteratee, есть линзы (для вложенных конечных коллекций), сюда же можно зипперы по идее добавить, ну и еще куча всего чего я не знаю, можешь посмотреть разные prelude в сабже

Ответы239649239805

2 авг, 16:24 347 1239649

>>1239636
Объясни зачем нужны трансдьюсеры, чем они отличаются от ленивых вычислений которые уже из коробки в Хаскеле? Давно пытаюсь это понять, может ты сможешь помочь?

Ответы239665

2 авг, 17:13 348 1239665

>>1239649
Трансдьюсеры к ленивости вообще не имеют отношения. Это чисто функциональные трансформации, которые ничего не знают о том, как получившиеся функции будут выполняться - лениво ли, энергично ли, над коллекциями или вообще над чем-то другим. То есть трансдьюсер просто берет одну функцию, которую можно скормить в fold, и возвращает другую. Там есть еще кое-какие детали, но в целом идея думаю понятна.

В кложе по умолчанию как раз используются ленивые коллекции (как в хаскеле, только ленивость не на уровне всего языка, а именно на уровне коллекций), а трансдьюсеры к коллекциям не привязаны - их можно, например, накинуть на асинхронные каналы в го-блоках.

Ответы239678

2 авг, 17:48 349 1239678

>>1239665
>Там есть еще кое-какие детали, но в целом идея думаю понятна.
Нет, совсем не понятна. Я могу скормить в fold функцию (+1). И могу (*2). Теперь я просто беру и объединяю их композицией (+1).(2) Зачем мне нужен какой то трансдьюсер?

Ответы239687239699

2 авг, 18:01 350 1239687

>>1239678
>Я могу скормить
Не можешь. (+1) ты только в map скормишь.

Ответы239717

2 авг, 18:15 351 1239699

>>1239678
Не можешь, почитай, что такое fold (можешь "tutorial on unversality and expressiveness of fold" навернуть).

Ну и трансдьюсеры композируются и так обычной композицией, лол. А вот reducing functions ты обычной композицией не скомпозируешь, потому что, ну, и типы не совпадут, и есть всякие нюансы типа раннего выхода (ищем элемент, нашли - зачем дальше кушать инпут? выходим), внутреннего локального состояния и т.п.

Ответы239717

2 авг, 18:29 352 1239717

>>1239687
Лол, и правда ведь. Кажется я начинаю понемногу прозревать. Мне казалось это как раз с map связано все.
>>1239699
>То есть трансдьюсер просто берет одну функцию, которую можно скормить в fold, и возвращает другую.
И какую он функцию тогда возвращает. Если я допустим скормлю (+).
Как тогда трансдьюсеры композируются?
А можно примеры на Хаскеле, только попроще?

Ответы239729239877

2 авг, 18:55 353 1239729

>>1239717
Вот такую
(Num a, Foldable b) => a > b a -> a

2 авг, 21:04 354 1239805

>>1239636
Да, трансдьюсеры, хотел их упомянуть. Но мне казалось, что я пытался вспомнить какое-то другое слово

2 авг, 23:37 355 1239877

37 Кб, 910x55024 Кб, 963x33726 Кб, 821x425

>>1239717
Короче глянь пикрелейтед (rf = reducing function, conj = добавление элемента в список), лень сейчас на х-ле переписывать

Ответы239885240106

3 авг, 00:10 356 1239885

>>1239877
Обожжи
(empty xs)
Это предикат возвращающий true на пустом списке (почему тогда без ?) или просто пустой список (но зачем тогда нужен аргумент не понятно)

Ответы239889

3 авг, 00:18 357 1239889

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

Ответы239899

3 авг, 00:57 358 1239899

>>1239889
Чем это отличается от map (+1) . filter even ?

Ответы240309

3 авг, 11:41 359 1240106

>>1239877
conj добавляет в хвост? Ой пиздец-пиздец.

Ответы240309

3 авг, 17:24 360 1240309

>>1239899
Блядь, ну прочитай еще раз, что тебе пишут. map и filter работают с коллекциями. Трансдьюсеры не работают с коллекциями и ничего о них не знают (смотри код). Можно построить цепочку трансформаций, аналогичую map (+1) . filter even, и она ничего не будет знать и никак не будет зависеть от конкретных коллекций. Можешь потом ее применить к итераторам, ленивым спискам, векторам, асинхронным каналам, еще каким-нибудь хитровыебанным абстракциям - твои map и filter уже будут с ними работать (и притом эффективно) без дополнительного кода. Посмотри определение map в prelude. Потом посмотри определение mapping у меня на пике. Уловил?

>>1240106
[] - это вектора (иммутабельные массивы, amortized constant time операции доступа по индексу), а не говносписки. "Пиздец-пиздец" - это как раз списки по умолчанию для всех sequential вещей, привет 80-ые. Как раз поэтому кстати эликсир сосет и никто в здравом уме не пользуется prelude функциями для чего-то кроме хелло ворлдов и факториалов.

Ответы240377

3 авг, 18:58 361 1240377

>>1240309
А можешь мне их типы расписать и алгебры этих самых трансдьюсеров? Может вот тогда то я докумекаю.

Ответы240563

4 авг, 00:30 362 1240563

>>1240377

Ну тебе ведь написали уже (упрощенные) типы. Полные типы по смыслу будут такими же, только все надо обернуть в десять манаток и тайпклассов, чтобы заиметь локалстейт\ранний выход и 0,1,2-арные операторы. Короче, let me google that for you, блядь: https://conscientiousprogrammer.com/blog/2014/08/07/understanding-cloure-transducers-through-types/

15 авг, 07:10 363 1246930

Мне нравятся идеи функциональщины, я активно использую ее в работе, вот только я не вижу никакого смысла в именно чистой функциональщине. Точно также как я не вижу смысла в чистом ООП или императивном стиле. Предпочитаю всегда иметь лучшее из всех подходов, а пуризм оставлять недоумкам-фанатикам. Из мультипарадигменных активно использую perl(это любовь навсегда) и js(суровая необходимость). Тем не менее мне нравится время от времени читать код на чистой функциональщине ради того, чтобы "заражаться" другим взглядом на вещи. Это позволяет пересмотреть свой код на других языках и улучшить его.

Ответы246971247065247231

15 авг, 10:41 364 1246971

>>1246930

То есть у тебя лёгкий случай байтоёбства - процедурное программирование головного мозга и ты не можешь в пуризм, всё понятно.

48 Кб, 1885x214
15 авг, 14:17 365 1247065

>>1246930

Ответы247232

15 авг, 17:44 366 1247231

>>1246930
Профит чистой функциональщины (как в хаскеле) в упрощении доказательств. Для промышленного кода это не всегда удобно, да, и обычная функциональщина (окамл, кложа, скала, эликсир) обычно тупо удобнее.

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

15 авг, 17:45 367 1247232

>>1247065
традиции-двача.пнг

17 авг, 19:55 368 1248306

>>1077271 (OP)
Кто там про трансдьюсеры спрашивал?

Вот вам объяснение с морфизмами и котегориями:
https://nextjournal.com/zampino/fold

Охуенная кстати штука этот некстжоурнал

Ответы248334

17 авг, 20:54 369 1248334

>>1248306
Блин, все это хорошо, но если бы я любил скобочки и динамическую дрисню, я бы тогда заглядывал совсем в другой тред.
Сейчас что то нет сил разбираться с этими вашими дрансдьюсерами. Если бы кто мне максимально доступно объяснил - вот у меня есть такая-такая проблема, и я применяю трансдьюсер и заебок. С примерами на хачкеле только; хачкель - сила, скобки - могила.

Ответы248341

17 авг, 21:06 370 1248341

>>1248334
>Сейчас что то нет сил разбираться
¯\_(ツ)_/¯

>С примерами на хачкеле
Выше вкидывали же.

18 авг, 13:38 371 1248569

>>1077271 (OP)
Почему в шапке нет Душкина, я не понял?

17 Кб, 299x168
19 авг, 03:46 372 1248998

поясните как по тру функциональщине работать с датой

Ответы249048249075249121

19 авг, 11:08 373 1249048

>>1248998
Нельзя интересоваться временем.

19 авг, 12:21 374 1249075

>>1248998
Now и then предавай в параметры

Ответы249182

19 авг, 13:51 375 1249121

>>1248998
В монаде IO. Чистый код работает вне времени.

Ответы249182

19 авг, 16:16 376 1249182

>>1249075
покажи на пальцах антош плз

>>1249121
еще лучше лол

Ответы249309

19 авг, 19:36 377 1249309

>>1249182
>еще лучше лол
Ну а хули ты хотел? Вся грязь в IO:
https://ideone.com/3tfO2m

Ответы255357

21 авг, 19:16 378 1250466

>>1109457
Ни в одном более-менее сложном языке нет. Хаскель тут мало чем отличается от тех же крестов, например.

Ответы250500

21 авг, 19:54 379 1250500

>>1109457
> foo(a)
> догадайся, сколько функция займёт, без её определения
>>1250466
> крестов
Ну если тебе кресты непонятны, то тебе и С непонятен, потому что рантайм практически тот же.
Для тебя компилятор предоставляет возможность самостоятельно плеваться функциями, если ты дашь ему шаблон, инкапсулировать функции в структурах, называя это классами.
По сути, конструкторы, деструкторы - вызовы С-функций, автоматические.
Ну вот фича с виртуальными функциями и сворачиванием стека - это, конечно, новизна. Но это тоже не далёкий скачок от С.
А рантайм С это то, на чём все учат студентов, алгоритмам там, ну или просто структурам данных, это то, что программисты, как они считают, понимают глубоко и с нюансами.
Я не знаю Хаскелль ваш пока что, но разве он не продолжает многие идеи Лиспа и его Лисп-машин?

Ответы250585250737

21 авг, 21:15 380 1250585

>>1250500
>Я не знаю Хаскелль ваш пока что, но разве он не продолжает многие идеи Лиспа и его Лисп-машин?
Я сам мимокрокодил, но хаскель вроде как идейный потомок ML-семейства, это немного другая ветвь эволюции языков.

22 авг, 07:55 381 1250737

>>1250500
>А рантайм С
Это то еще неизвестное говно при включенных оптимизациях.

Ответы250754

22 авг, 09:09 382 1250754

>>1250737
Ну да, по сути вся скорость работы сводится не к естественности и нативности языка для машины, а к миллионам человеко-часов пыхтения над компилятором.

Ответы250755251465

22 авг, 09:12 383 1250755

>>1250754
>Ну да, по сути вся скорость работы сводится не к естественности и нативности языка ассемблера и машинных кодов для машины, а к миллионам человеко-часов пыхтения над дырявыми приборчиками в процессорах, чтобы потом Spectre, Meltdown, TLBleed.

22 авг, 09:15 384 1250756

Так что расслабьтесь, полной детерминированности и контроля вам никакая байтоебля не даст. Ебите лучше алгоритмы, если и алгоритмы не помогут, то уже тогда долбитесь в data-oriented design чтобы кеш дышал. Это на любом языке можно делать, к слову.

Ответы250782

22 авг, 10:37 385 1250782

>>1250756
>чтобы кеш дышал
Что делать, если мой кеш не дышит? ИВЛ поможет? Пишу на Python

Ответы250789

22 авг, 10:56 386 1250789

>>1250782

Array of bulk objects -> Singleton of collections of primitive types + Proxy objects

Ответы250791

30 Кб, 480x360
22 авг, 11:06 387 1250791

>>1250789

Ответы250864

22 авг, 13:29 388 1250864

>>1250791
Не понимаю, о чём он, но, короче, данные грузятся в кеш целыми линиями, т.е. тебе надо сделать так, чтобы загружались сразу только нужные, и как можно меньше ненужных, чтобы не лазить в ОЗУ лишний раз, и чтобы кеш всегда был актуален. В линию, погружаются, очевидно, подряд идущие данные. Так что массивы тоже могут приемлемы при соблюдённых правилах.
В контексте многопокпока об этом написано у Энтони Уильямс в "Практике разработки многопоточных программ". Но там речь о перебрасывании кеша в основном.
Но суть будет доведена.

Ответы250956

22 авг, 15:09 389 1250956

>>1250864
что такое линия?

Ответы250966

22 авг, 15:25 390 1250966

>>1250956
https://manybutfinite.com/post/intel-cpu-caches/

23 авг, 14:54 391 1251465

>>1250754
Так и должно быть. Один раз написать хороший оптимизирующий компилятор полезнее, чем каждый раз писать оптимизированную под одну архитектуру программу.

23 авг, 19:49 392 1251594

51 Кб, 1024x576159 Кб, 2002x666

>2018
>До сих пор нет нормальной интеграции с редакторами

А ведь я всего-то хочу видеть удобное отображение результатов QuickCheck-тестов.

Ответы251615251620251624251718

23 авг, 20:13 393 1251615

>>1251594
> JS
А туда ли ты зашёл, петушок?

Ответы251617

139 Кб, 1280x720
23 авг, 20:16 394 1251617

>>1251615
Во-первых, это всего лишь иллюстрация, и я слегка удивлен, что ты ее не понял.
Во-вторых, лучше быть жс-петушком, чем токсичным мудаком.

Ответы251627

23 авг, 20:19 395 1251620

>>1251594
> ошибки в коментах
Вот это дебил.
Никто так не делает, кроме ЖСтуна.
Это только ЖС-дебилам так можно, а так - проваливай.

Ответы251628251638

23 авг, 20:23 396 1251624

>>1251594
В имаксе есть, емнип.

Ответы251628

19 Кб, 277x182
23 авг, 20:33 397 1251627

>>1251617
> 2k18
> зашёл на двач
> ноет про токсичность

Ответы251628

757 Кб, 1160x1000
23 авг, 20:35 398 1251628

>>1251620
>implying что это настоящие комменты
Ты действительно не понимаешь, что это просто визуализация, которая исчезнет как только ошибка будет исправлена?
>проваливай
Нет ты! Токсичные педики должны уйти.

>>1251624
Имакс всем хорош, кроме кривой обучения. Не стану я использовать инструменты, которые даже потенциально не смогу подсунуть коллегам.

>>1251627
Да знаю я где нахожусь, знаю. Но не обязательно же вести себя так.
Держи леденец, няша.

Ответы251634251638

23 авг, 20:44 399 1251634

>>1251628
> это просто визуализация
Ты настолько туп, что не понимаешь, что шрифты твоих исходников это просто визуализация, и они исчезнут, если ты застрелишься

Ответы251638

23 авг, 20:58 400 1251638

>>1251628
>Имакс всем хорош, кроме кривой обучения.
Согласен. Спейсмакс помогает, но не до конца.

>Не стану я использовать инструменты, которые даже потенциально не смогу подсунуть коллегам.
Я не Ъ-хаскеллист, так что вообще не в курсе, что там сейчас в основном используется. Но когда ковырял его некоторое время назад, имакс вроде был единственной нормальной IDE (и вроде бы ничего особо не поменялось). Если тебе нужно потенциально сажать коллег, то одним стулом всегда следует предлагать простой терминал-бейзед воркфлоу с перезагрузкой тестов при изменении файлов на диске и возможностью использовать любой редактор.

Еще можешь на ризон глянуть, там плугин для атома активно пилится фейсбуком, ну и в целом продать его (может быть) проще.

>>1251620
>>1251634
Съеби обратно в ньюфаг-тред, пожалуйста.

24 авг, 00:12 401 1251718

>>1251594
VS Code + Haskell Language Server

93 Кб, 604x557
28 авг, 11:34 402 1253997

>>1077271 (OP)
Добватье в шапку эту годноту:
https://www.ohaskell.guide/

Ответы254147

28 авг, 16:21 403 1254147

>>1253997
Ого, действительно годнота!

29 авг, 14:54 404 1254703

Поясните, что хорошо пишется (а лучше уже написано) на Хаскелле? Имеет ли какое-то практический смысл изучать этот язык, кроме гимнастики мозга?

Ответы254794254937254947257076

29 авг, 16:39 405 1254794

>>1254703
HTTP очень хорошо пишется, если использовать Servant.

29 авг, 19:22 406 1254937

>>1254703
pandoc, например - швейцарский нож для текстовых форматов
или shellcheck, например
это из того, чем повседневно пользуюсь

Ответы254947

29 авг, 19:40 407 1254947

>>1254937
pandoc действительно убергодная штука

>>1254703
тащем-то еще оконный менеджер на сабже есть, xmonad
короче, что угодно нормально пишется (кроме хард риалтайма всякого)

Ответы254952

29 авг, 19:51 408 1254952

>>1254947
Двачую xmonad, довольно долго им пользовался, но переехал году в 13 на awesome а потом на i3wm из-за того, что у него интеграция с панелькой была какая-то невразумительная. Есть кто-нибудь, кто его юзает? Как там сейчас, polybar смогу прикрутить?
Понимаю, что это не /s/, но у вас один хрен тред полумёртвый

Ответы254961255230257076

29 авг, 20:12 409 1254961

>>1254952
ein OS
ein Desktop
ein GNOME

Tod für unterperdolikmenschen!

29 авг, 22:10 410 1255014

Как в Хаскеле реализуются хэш-таблицы, всякие disjoint set и сортировки? Ведь менять значения нельзя, а для этих алгоритмов это критически важно.

Ответы255040255405

29 авг, 22:50 411 1255040

>>1255014
>Как при социализме реализуется поощрение работников общественно важных профессий, ведь давать им премии и делать зарплату больше нельзя
Меняют значения.

30 авг, 12:06 412 1255230

>>1254952
Юзаю xmonad + xmobar, все устраивает.

Ответы257076

30 авг, 15:47 413 1255357

>>1249309
>резал из олфейс дифферент
анон там же по-русски блять написано, ну ты чиво нахуй!?

30 авг, 17:34 414 1255405

>>1255014
Через деревья. Это не ты в соседнем треде то же самое эн дней назад спрашивал?

Ответы255810

31 авг, 10:00 415 1255810

>>1255405
> Через деревья
У хэша сложность в среднем лучше, и при правильном подходе он компактнее. Так что это не замена.

Насколько я понял, существующие реализации хэшей работают через unsafe код, и единственный разумный способ использования - сначала разом весь построить, потом только чтение. Иначе тебе нужно дерево, т. к. чистота

Ответы256041

31 авг, 15:59 416 1256041

>>1255810
>У хэша сложность в среднем лучше
Чем у чего? Чем у хэша?

>Так что это не замена.
А мужики-то и не знали...

>Насколько я понял
Нихуя ты не понял, тебе все ссылки еще в том треде вкинули. Меньше выебывайся и больше читай.

Ответы256464

1 сен, 10:46 417 1256464

>>1256041
> Чем у чего? Чем у хэша?
Чем у дерева, очевидно. У хэша в среднем O(n), у дерева - O(n log n)

> А мужики-то и не знали...
Не замена в том смысле, что во многих случаях честная хэш-таблица будет быстрее. Так-то понятно, что всё это маппинг

> >Насколько я понял
> Нихуя ты не понял, тебе все ссылки еще в том треде вкинули. Меньше выебывайся и больше читай.
Я правда не понял, но ссылки ты давал кому-то другому, это был мой первый пост на этой доске. Посмотрел - хэши реализуются в монадах IO и ST (ожидаемо). Хак с unsafePerformIO я видимо где-то в другом месте видел

Алсо, у меня как (только не бейте ногами) хорошо знакомого с лиспом вызывают уныние вот такие простыни копипасты как здесь:
http://hackage.haskell.org/package/hashtables-1.2.3.1/docs/src/Data-HashTable-IO.html#insert
На лиспе бы просто написали макрос, который бы нагенерил всех этих обёрток вместе с декларациями. Неужели в хаскеле до сих пор нет ничего, что позволит обойтись без копипасты? Смотрел на template haskell, но он, насколько я понял, не может в декларации (вот эти SPECIALIZE и пр), да и не выглядит сильно удобным.

Ответы256577256592

1 сен, 15:20 418 1256577

>>1256464
>Чем у дерева, очевидно.
У хэшмапа сложность лучше, чем у хэшмапа, я тебя услышал. Я нихуя не понимаю, что ты имеешь в виду и о какой сложности ты говоришь. Доступ у хэшмапов на деревьях - log_a n для большого a, effective constant time который.

>во многих случаях честная хэш-таблица будет быстрее.
Ну так и код на си во многих случаях будет быстрее кода на питоне. Это же не повод говорить, что пайтон - не замена си для написания сайтиков, например. Узкое место у тебя будет, только если ты заполняешь за один раз огромный хэш с нуля, но ровно для таких случаев и существуют транзиенты. Как впихнуть транзиенты в чистый язык - это уже другой вопросhttps://github.com/ekmett/transients

>Я правда не понял, но ссылки ты давал кому-то другому, это был мой первый пост на этой доске.
Ну ладно, извини тогда, анон.

>только не бейте ногами
Лол, да я как бы тоже не хаскеллист, бггг.

>но он, насколько я понял, не может в декларации
Хм, нет, я погуглил и получается, что он все-таки может в прагмы.

>да и не выглядит сильно удобным.
Ящитаю в негомоиконном (тем более статически-типизированном) языке удобных макросов в принципе быть не может.

Ответы256596256744

1 сен, 15:50 419 1256592

>>1256464
Виталя, неужели ты на двощах сидишь?

1 сен, 15:53 420 1256596

>>1256577
>Ну так и код на си во многих случаях будет быстрее кода на питоне.
Он будет быстрее только в рамках Tilde Notation, Big Oh таким же будет.

Ответы256665

1 сен, 17:50 421 1256665

>>1256596
При чем тут биг оу, если речь о скорости? Скорость != сложность.

Ответы256679

1 сен, 18:08 422 1256679

>>1256665
>Скорость != сложность.
А если программа под большой нагрузкой работает? Или производит сложные вычисления?

Ответы256684

1 сен, 18:16 423 1256684

>>1256679
То скорость все еще != вычислительная сложность, очевидно, так как это по определению понятия разных категорий. Я не улавливаю, о чем вообще разговор сейчас идет?

Ответы256690

1 сен, 18:19 424 1256690

>>1256684
>скорость все еще != вычислительная сложность
Но ведь вычислительная сложность напрямую определяет скорость. Ты какой-то сектант, вбил себе в бестолковку, что хэш-таблицы и деревья это одно и тоже и прикидываешься тут дурачком.

Ответы256708

1 сен, 18:44 425 1256708

>>1256690
>Но ведь вычислительная сложность напрямую определяет скорость.
Нет, не напрямую. Если ты на практике не встречался со случаями, когда алгоритм с лучшей сложностью дает худшую скорость, то можешь хотя бы просто погуглить материалы про асимптотический анализ алгоритмов - в любой вводной статье это описывается.

>что хэш-таблицы и деревья это одно и тоже
Почитай в гугле, что такое хэшмапы, и осознай, что хэшмапы могут быть мутабельными или иммутабельными, и что иммутабельные хэшмапы могут быть реализованы с помощью деревьев. Я уже в трех постах тебе на это указывал.

Вместо того, чтобы кидаться пустыми оскорблениями, разберись с понятиями, которые используешь. Это как минимум интереснее, согласись.

Ответы256717256718

1 сен, 19:04 426 1256717

>>1256708
>когда алгоритм с лучшей сложностью дает худшую скорость
Там либо константы при N большие, либо объем данных небольшой, но тогда про асимптоты речи не должно идти.

>могут быть реализованы с помощью деревьев
А я и не спорил, что не могут. Только как O(1) получить?

Ответы256744

1 сен, 19:05 427 1256718

>>1256708
>разберись с понятиями, которые используешь
А ты оставь этот менторский тон.

Ответы256744

1 сен, 19:45 428 1256744

>>1256717
>Только как O(1) получить?
Я уже писал по этому поводу в >>1256577-посте под спойлером. Ъ-O(1) не будет впрочем, его и для мутабельных хэшмапов тоже не будет, строго говоря, будет логарифм_32 или что-то в таком роде, что называется amortized\effective constant time - то есть на реальных данных, которые в хэшмапу могут поместиться, она ведет себя почти как O(1), но на самом деле там просто очень пологий рост.

Ъ-O(1) на самом деле не Ъ, а такой же, как у мутабельных хэшмапов можно получить через линейные типы а-ля Раст, когда ты на самом деле свою хэшмапу ебешь и в хвост и в гриву меняешь, но компилятор может доказать, что эти изменения никогда не видны извне имплементации, а потому эффективно она является иммутабельной. Но так ты теряешь персистентность и к тому же это никому ненужно, так как на практике разницы между 1 и лог32 нет.

Вообще, на практике важно не столько это, сколько потребление памяти например, иммутабельные мапы шринкаются (отдают мусор гц) автоматически при удалении элементов, а мутабельные продолжают занимать максимально достигнутый объем; в каких-то случаях это хорошо, в каких-то - плохо, дружба с многопоточностью иммутабельные структуры, очевидно, автоматически безопасны при доступе из нескольких потоков, паттерны доступа например, при конкурентном обновлении больших вложенных хэшмапов возникают случаи, когда у тебя два разных потока идут в разные "поддеревья" твоих хэшмапов (то есть операции коммутативны), но со стандартными структурами ты их будешь зря лочить\перезапускать транзакцию, поэтому оптимальнее использовать особую, уличную хэшмапу, которая понимает вложенность и независимость путей и т.п.

>>1256718
Да без проблем. Но с понятиями все равно разберись :P

Ответы256764256766256767

1 сен, 20:05 429 1256764

>>1256744
>Ъ-O(1) не будет
Ну почему же, если хеш нормально считается, то коллизий не будет, либо их количество будет минимальным. Можно двойное хеширование использовать, тогда коллизий практически не будет. Плюс, если известен объем данных, то можно создать хеш-таблицу сразу нужного размера.
К тому же, у деревьев есть еще пара проблем: больше потребление памяти и промахи в кэше процессора.

Ответы257243

1 сен, 20:08 430 1256766

>>1256744
>на практике разницы между 1 и лог32 нет
Я бы не сказал, в критичных по скорости участках она вполне может быть. Но для 99% приложений да, скорее похуй.

Ответы257243

1 сен, 20:08 431 1256767

>>1256744
>лог32
Откуда взялось 32?

Ответы257243

22 Кб, 362x480
2 сен, 14:33 432 1257076

>>1254703
Cardano, например.

>>1255230
Двачую этого, xmobar нормально работает, бывали конечно косяки в некоторых релизах, но сейчас все норм. Так же могу порекомендовать dzen2 в качестве альтернативы.
>>1254952

2 сен, 17:36 433 1257243

>>1256764
>Ну почему же
Ну потому что все известные мне реализации хэшмапов подразумевают возможность коллизий. Если это считать "Ъ-O(1)", то и у дерева такой же "Ъ-O(1)".

>больше потребление памяти
Про память я уже написал, что оно может быть как больше, так и меньше, зависит от данных.

>промахи в кэше процессора.
А с мутабельной хэшмапой в какой-нибудь джаве промахи в кэше магически исчезнут? Кулстори, бро.

>>1256766
Да, согласен. Под "на практике" я это и имел в виду.

>>1256767
Ну там же не бинарные, а очень широкие деревья используются, 32-арные например.

2 сен, 20:32 434 1257367

Сап, Хаскелланы. Посоветуйте во что можно поконтрибьютить на хабе/лабе, во что бы вы сами, но времени нет?
Спасибо

Ответы257729258052

454 Кб, 1199x900
3 сен, 09:41 435 1257729

>>1257367
https://github.com/haskoin

3 сен, 17:50 436 1258052

>>1257367
в GHC

3 сен, 17:59 437 1258065

>>1077271 (OP)
Добавьте уже в шапку конфу треда, там все два с половиной анона сидят @hcdev

Ответы258356

sage 3 сен, 22:03 438 1258356

>>1258065
Петушиный загон же здесь: https://2ch.hk/pr/res/1249820.html (М)

5 сен, 20:12 439 1259725

Что-то меня всякие стаковерфловы только больше запутали с Текстом.
Это все-таки зашугаренное пердоленье с обычными Чарами?
Или как оно работает на низком уровне?
Объясните, плизки

8 сен, 17:03 440 1260985

>>1077289
Вкатился в тред и сразу наткнулся на
> https://github.com/jystic/hadoop-tools/tree/master/hadoop-tools
Почему там один файл на 500 строк кода? В хаскеле нельзя модульно все делать? Тогда я выкатываюсь.

Ответы261007

8 сен, 18:09 441 1261007

>>1260985
В глаза ебешься?

10 сен, 18:09 442 1262087

Котаны, хотим на работе хаскель заюзать (вместо раста/котлина) для бизнес-логики. Что скажете?

Ответы262105262383

10 сен, 19:09 443 1262105

>>1262087
На расте-то безопаснее будет, тем более если вы его уже.

Ответы262107

10 сен, 19:13 444 1262107

>>1262105
Чем это раст безопаснее хаскеля?

В расте не устраивает вот что:
1, Ебать как долго компилится
2. Молодая экосистема, некоторых либ либо вообще нет, либо они кривые и хуевые
3. В тех либах что есть, видно что протекает раби-сознание авторов это я про актикс, когда выполнение зависит от какого-то глобального состояния, и валится с паникой в рантайме.

Про котлин вообще говорить нечего, это просто ебаное легаси от которого потихоньку избавляемся.

Мне в целом раст нравится, а за хачкель топит коллега-наркоман.

Ответы262113262140262604

10 сен, 19:27 445 1262113

>>1262107
Окамл лучше наверни, хороший компромисс.

Ответы262114

10 сен, 19:30 446 1262114

>>1262113
Так чем хаскель-то плох? Или чем лучше окамл?

Ответы262121262604

10 сен, 19:41 447 1262121

>>1262114
Да ничем он не плох, окамл проще гораздо, вкатиться можно быстрее.

Ответы262127

10 сен, 20:03 448 1262127

>>1262121
У нас есть гуру хаскеля, я сам более менее знаю. Так что это не проблема вкатывания.

10 сен, 21:03 449 1262140

>>1262107
>Про котлин вообще говорить нечего, это просто ебаное легаси от которого потихоньку избавляемся.
Я аж смуззи поперхнулся от этого.
Стек меняете каждые три месяца?

11 сен, 06:07 450 1262278

Минутка юмора. Ребзя, каждый раз когда ебашите монады в хачкеле, на скалке, ну или на худой конец пишите в монадном стиле на linq, знайте, вы... "ОЛИМПИАДНИКИ". Посидел в пораше немного, узнал о том, что монадо-подобный дрист на сисярпе https://blogs.msdn.microsoft.com/lukeh/2007/08/19/monadic-parser-combinators-using-c-3-0/ это "олимпиадный код".

Узнал всё от "node.js"-бога. Такие дела.
Есть вообще кто-то тупее js-макак в принципе?

Ответы262336262795262798

11 сен, 10:02 451 1262336

>>1262278
пхп-макаки?

11 сен, 11:17 452 1262383

>>1262087
Офигеть, где-то хаскель собираются использовать в промышленном коде. А что за компания или хотя бы область деятельности, если боишься дианона? Не боитесь, что потом нового хаскелиста будете три года искать когда ваш гуру из запоя не вернётся?

Я без наезда, просто вот этот аргумент (сложный найм)обычно первым приводят когда предлагаешь редкий язык.

Ответы262388262604262790

11 сен, 11:20 453 1262388

>>1262383
Стартап в финансовом секторе. Более того, у нас тут страна с населением в 5 миллионов человек. Так что скорее всего хаскель тут знает как раз наш наркоман и еще 2 человека.

Ответы262604

11 сен, 13:25 454 1262487

Привет хаскеллисты! Думаю вкатиться, скажите честно: в чём вы видите недостатки/недоработки Хаскелля?

Ответы262503263395

11 сен, 13:39 455 1262503

>>1262487
Главный недостаток — ты охуеешь вкатываться.

Ответы262605

11 сен, 17:33 456 1262604

>>1262107
>Чем это раст безопаснее хаскеля?
От ленивости пиздюлей не огребешь. Понятней, предсказуемей. Ну ебли побольше, да.

Три пункта жизненные, тут спору нет.

>>1262114
В окамле синтаксис слегка уебанский местами, вместо встроенной стандартной библиотеки сторонняя (но впрочем от того не менее стандартная), нет ленивости, можно в мутабельность без ебли с манатками, можно компилять в жс, есть конкурентность, нет параллелизма, людей в целом наверное поменьше, чем у х-ля... хуй знает, если у вас есть гуру, то логичнее взять то, в чем он шарит.

>>1262388
>Стартап в финансовом секторе.
Бля, ну тогда сам бох велел х-ль брать! или окамл

>>1262383
Да ну на удаленку-то не проблема будет голодного сиэс-мейджора найти

Ответы262790

11 сен, 17:33 457 1262605

>>1262503
>Главный недостаток — ты

Ответы262790

11 сен, 23:32 458 1262790

>>1262383
>Офигеть, где-то хаскель собираются использовать в промышленном коде
https://github.com/erkmos/haskell-companies

>>1262604
>От ленивости пиздюлей не огребешь.
сказки о проблемах с ленивостью расказывают довны ничего на хаскеле не написавшие

>можно в мутабельность без ебли с манатками
как что-то хорошее

>можно компилять в жс
как и хаскель

>>1262605
this

Ответы262955263205

11 сен, 23:39 459 1262795

>>1262278
>https://blogs.msdn.microsoft.com/lukeh/2007/08/19/monadic-parser-combinators-using-c-3-0/

60 Кб, 1280x720
11 сен, 23:40 460 1262798

>>1262278
>https://blogs.msdn.microsoft.com/lukeh/2007/08/19/monadic-parser-combinators-using-c-3-0/

12 сен, 01:33 461 1262836

В чем сложность хаскелля? Всего то матан знать.

Ответы262902

12 сен, 07:47 462 1262902

>>1262836
В хачкеле нет "матана", наркоман.

Ответы263390

12 сен, 09:29 463 1262955

>>1262790
>Сказки о проблемах с указателями в С рассказывают довны, если ты выстрелил себе в колено -- то проблема в тебе, а не в дробовике

Ответы262962

12 сен, 09:55 464 1262962

>>1262955
>Сказки о проблемах с указателями в С рассказывают довны, если ты выстрелил себе в колено -- то проблема в тебе, а не в дробовике

Именно так, дебич.

Наличие windows и linux (написаны на C) и отсутствие других операционных систем, которые не ноунейм (написанных на бизопасной абстрактопитушне) - этот факт подтверждает.

Ответы262979262995

12 сен, 10:23 465 1262979

>>1262962
Проблема не в написании ОС, а в том что никто под твою ос не будет переписывать софт. А если ты эмулируешь линакс, то нахуй ты нужен?

Ответы262995

72 Кб, 722x423
12 сен, 10:46 466 1262995

>>1262979
>>1262962

Пацаны, хотите поржать?

https://github.com/achilleasa/gopher-os

> How does it look?

Ответы262998

12 сен, 10:53 467 1262998

>>1262995
Над чем ржать то?

Ответы263001

12 сен, 10:58 468 1263001

>>1262998
>Над чем ржать то?

>go
>кококобизопасно сборщик мусора
>скриншоты как наша кококобизопасная OS выглядит
>kernel panic : system halted

Ответы263010

12 сен, 11:04 469 1263010

>>1263001
ОС со сборщиком мусора? Смишно.
Но судя по остальным скринам оно паникует вполне логично, потому что init обосрался по причине отсутствия оного.

12 сен, 16:37 470 1263205

>>1262790
>сказки о проблемах с ленивостью расказывают
Тебе уже ответили, поддвачну того анона.

>как что-то хорошее
Да.

>как и хаскель
Разве там есть что-то живое? ghcjs, или про что ты?

>this
Спасибо.

13 сен, 01:16 471 1263390

>>1262902
Даже так. Хаскелль не сложнее паскаля.

Ответы263428

13 сен, 01:24 472 1263395

>>1262487
ПОСТАВИЛ -1 ВМЕСТО (-1)
@
В ФУНКЦИЮ ПЕРЕДАНО НА ОДИН ПАРАМЕТР МЕНЬШЕ
@
ОХУЕВАЕШЬ ОТ НЕЧИТАЕМЫХ ОШИБОК
@
КОММЕНТИШЬ ПО ОДНОЙ ФУНКЦИИ, ЧТОБЫ ЛОКАЛИЗИРОВАТЬ ОШИБКУ

Ответы263598

13 сен, 06:54 473 1263428

>>1263390
В хачкеле для написания кода тебе надо искать экстремумы, локальные минимум и максимумы, доказывать теоремы, брать производные и интегралы, находить пределы функций? Что ты несёшь блядь. Есть подоплёка аппликативов, монад, функторов теории категорий к математическим моделям, только тебе для дрочбы в хачкеел со всем этим не надо об этом задумываться.

13 сен, 14:55 474 1263598

>>1263395
Да ну, маняфантазии какие-то.

Ответы263644

13 сен, 16:23 475 1263644

>>1263598
трустори, вчера делал задачу из курса на степике и минут 5 охуевал с простейшей ошибки. Сообщения от компилятора еще хуже, чем от матерого шаблонного кода в C++. В хаскелле даже имена функций не пишутся. Иди ебись, сравнивая типы, что называется. Очень удобнонет

Ответы263674

13 сен, 18:04 476 1263674

>>1263644
>вчера делал задачу из курса на степике
Ну скинь код с ошибкой и сообщение тогда, чтобы не быть голословным, давай всем тредом попробуем угадать.

Ответы263811

13 сен, 21:46 477 1263777

Хочу по вечерам вкатиться в хаскель. Книжки почитать, порешать задачки, может пописать учебные приложеньки.

Что надо устанавливать, какую IDE-шку использовать? На оф сайте какие-то 3 разных варианта установки, в вики ещё пять. Что наиболее православно? У меня мак.

По книжкам вроде вот эту рекомендуют?
https://www.amazon.com/Haskell-School-Expression-Functional-Programming/dp/0521644089

Ответы263782

13 сен, 21:54 478 1263782

>>1263777
emacs + intero
http://haskellbook.com/

Ответы263806

13 сен, 22:20 479 1263806

>>1263782
> emacs + intero
братишка спасибо за совет, я не сомневаюсь в чистоте намерений, но боюсь emacs слишком хардкорно для меня :3
Что-нибудь бы типа vsсode или на худой конец от JetBrains..

Книжку заценю, спасибо.

Ответы263812263823

58 Кб, 1214x368
13 сен, 22:34 480 1263811

>>1263674
Например. Делается каррирование и из функции с одним параметром вычитается 1. Как это можно понять из сообщения от компилятора?

Алсо буду признателен, если кто-то объяснит этот мунспик: a :: forall a. (Num (a -> a), Num a) => a -> a

Ответы263830

13 сен, 22:36 481 1263812

>>1263806
>но боюсь emacs слишком хардкорно для меня :3
Spacemacs попробуй, это вариация емакса для домохозяек с vi-шными кейбиндингами. dw знаешь? ну вот оно

13 сен, 23:06 482 1263823

>>1263806
Да пиши для начала в любой онлайн идешке. Потом просто поставь ghc любым способом, ghci в терминале запусти. Потом уже со stack разберешься. Но спейсмакс двачну.

13 сен, 23:12 483 1263830

>>1263811
>a :: forall a. (Num (a -> a), Num a) => a -> a
Это еще что, ты попробуй test -1 2 3 запустить.

А все почему? Безблагодатность обколются своим синтаксическим сахаром и ябут друг друга в парсеры. Нет бы как диды завещали делать, родина дала им sexpr'ы - нет, не хочу, хочу в парсеры ебаться и отлавливать баги с -1 и (-1). Зато статическая типизация. Мудачье, блядь, пидоры. И это программисты? Синтаксиса нацепили, говно жрут - пидоры, блядь, ебаные...

13 сен, 23:15 484 1263831

Кстати, сравните с православным верблюдом:

# test 1 2 -1;;
Error: This expression has type int -> int
but an expression was expected of type int

но по большому счету тоже говно безблагодатное, конечно

13 сен, 23:17 485 1263834

И с богоугодной Схемой, разумеется:

> (define (test a b c) (+ a b c))
> (test 1 2 -1)
2

Слышишь, как ангелы тихонько поют, когда ты читаешь этот код?

Ответы263842

13 сен, 23:23 486 1263842

>>1263834
На скале напишешь?

Ответы264235

10 Кб, 476x213
14 сен, 18:51 487 1264235

>>1263842
Миио проходил, на скале первый раз пишу, что тут за срач у вас?

Ответы264391

14 сен, 22:47 488 1264391

>>1264235
>срач
Я выдвинул тезис, что диагностические сообщения ghc - говно, а все согласились.

Ответы264752

15 сен, 20:52 489 1264752

>>1264391
Говорят, Олег умеет выводить constraint'ы type checker'а в уме.

Ответы277513

28 сен, 00:54 490 1271212

Господа, а кто из вас пишет на хаскелле на работе? Какие отрасли? Сколько человек в команде? Насколько сложно найти новых сотрудников?

Как дела вообще с трудоустройством, полный пиздец? Что по деньгам?

Ответы271589

28 сен, 20:41 491 1271589

>>1271212
>2ch.hk
>пишет на хаскелле на работе
А ты оптимист.

Ответы271651

28 сен, 23:23 492 1271651

>>1271589
так 2ch.hk — это же halls of elita

Но вообще, если серьёзно, а хули нет. Вполне возможно, что все 2 российских хаскеллиста тут сидят.

Ответы272059

29 сен, 20:39 493 1272059

>>1271651
Да не. Иди в жж к мише хаскеллистов ловить.

7 окт, 15:52 494 1275996

Только что начал учить хаскель и дошел до списков. Вот уж не знал, что строго типизированные списки можно называть гомогенными. Как элегантно звучит! Я теперь их всегда буду так называть и тешить своё чсв. Спасибо, хаскель.

Ответы276018

7 окт, 16:19 495 1276018

>>1275996
О, заодно вспомнил, ещё один элегантный, бесподобный термин, когда ботал химию. Внимание, маэстро в треде! Как вам такое -- "Гетерогенный список содержащий гомогенные списки разной структуры". Красиво? Вот это да, меня самого распирает от своей мудрости. Вот это я илитарий, БЛЯ. Прямо чувствую себя нитакимкаквсе долбаёбом
Я конечно уже понял, что в хаскеле лист гомогенный и он не может быть гетерогенным(так ведь?) но слушайте, это же охуенно звучит.

Ответы276019

7 окт, 16:23 496 1276019

>>1276018
Гетерогенный список - это рекорд.

мимоумудренный старец

Ответы276020276115283581

7 окт, 16:25 497 1276020

>>1276019
Прости меня грешного

7 окт, 18:18 498 1276115

>>1276019
Ну во. Дошёл до кортежей. Они как раз не гомогенные, а гетерогенные. То что я и хотел получить от списка есть в кортежах.
Кстати, вот что-то на тему гетерогенных списков, но я даже не разбирался, что там да как.
https://wiki.haskell.org/Fully-functional_heterogeneous_lists

Ответы276159

7 окт, 20:22 499 1276159

>>1276115
Рекорды и кортежи едины в своей сути. Следуй свету знаний, но не дай бесам сбить тебя с истинного пути.

мимоумудренный старец

Ответы276165276199

7 окт, 20:35 500 1276165

>>1276159
Почему ты список называешь "рекордами"? Я что-то не понимаю или это опечатка? Они похожи(как и все структуры данных), но у них есть несколько фундаментальных различий.
Я не дам бесам сбить меня с истинного пути, это же обычная любознательность.

7 окт, 22:11 501 1276199

>>1276159
Ааа... лол, я всё понял. Я двусмысленно понял слово "рекорд". Погуглил - теперь всё понял. Извиняюсь за такой глупый вопрос тогда.

11 окт, 01:11 502 1277513

>>1264752
Говорят, когда компилятор GHC запускают с параметром UndecidableInstances, он спрашивает ответ лично у Олега, поэтому и работает.

57 Кб, 660x440
sage 11 окт, 18:21 503 1277788

Ответы280917

14 окт, 11:14 504 1278769

Читаю про эти ваши lazy-evaluations и прочие блага чистых вычислений, поделитесь опытом, насколько потом стабильна и предсказуема скорость исполнения и что у Хаскеля с профилированием?

Ответы280822

18 окт, 02:48 505 1280822

>>1278769
>поделитесь опытом, насколько потом стабильна и предсказуема скорость исполнения
Скорость скорость исполнения абсолютно нестабильна и совершенно непредсказуема. Впрочем, как и у любой достаточно сложной программы, написанной на eager языке.
>что у Хаскеля с профилированием?
Профилирование охуенное. Аналоги criterion выглядят как быдлокодерские поделки (которыми они и являются). Впрочем, даже такие тулзы как criterion тебе не особо помогут в профилировании сложной программы.

Ты, блядь, как студент, который hello world написал. Типа "возьму я Си, там же я всё контролирую, я напишу самую быструю программу, а все остальные соснут!" Но нет, нихуя, сложность программы константна, и если ты возьмёшь lazy язык, или eager язык, ты одинаково заебёшься, просто в разных местах. И HPC на Хаскелле - это такое же байтоёбство, как на Cи. Хочешь выжимать максимум из программы, будь добр понимать, как работает компилятор и процессор, и руками под них всё оптимизировать. Это работает и для Хаскеля и для Джавы и для С++ абсолютно одинаково, и между eager и lazy нет особой разницы.

Ответы280889

18 окт, 10:34 506 1280889

>>1280822
Ты вы целом адекватен, братишка. Поэтому я поясню, что я как раз не студент и вполне себе занимаюсь байтоёбством и оптимизацией ебучих микросекунд. Читаю сейчас про Хаскель для саморазвития, и вот как-то возник выше обозначенный вопрос, сам понимаешь что если С относительно прозрачно разворачивается в Асм, плюс минус вполне описанные и предсказуемые оптимизации, то рантайм Хаскеля со стороны (я нуб в этой конкретной теме) выглядит как черный ящик с ебучей магией внутри.
Потому и любопытно, насколько это ящик бел, чист и ясен для тех, кто в теме

Ответы281160281278

18 окт, 11:38 507 1280917

>>1277788
Это Ева Грин?

18 окт, 19:09 508 1281160

>>1280889
можешь пердолить байты вручную сколько хочешь http://hackage.haskell.org/package/ghc-prim-0.5.3/docs/GHC-Prim.html

19 окт, 02:42 509 1281278

>>1280889
> то рантайм Хаскеля со стороны (я нуб в этой конкретной теме) выглядит как черный ящик с ебучей магией внутри.
LLVM для хачкеля давно написан

23 окт, 20:58 510 1283581

>>1276019
Вот нахуй я сюда зашёл? Ты мне настроение испортил.

30 окт, 19:20 511 1287145

Какие вообще задачи у Хаскеля? Если я хочу йоба паралельный многопоточный проект то разумнее взять Эрланг. Если просто нужен функциональный язык то есть широкий ассортимент лиспов. Если нужен перформанс то Раст.

Ответы287352292044

31 окт, 05:42 512 1287352

>>1287145
>Если просто нужен функциональный язык то есть широкий ассортимент лиспов
Типы, братан. Хаскель умеет генерировать бесплатные термы из нихуя, тем самым обеспечивая корректность по построению и сильные гарантии на стадии конпеляции без особых усилий (со стороны разработчика, использующего подходящие библиотеки). На хаскеле стоит писать если ты готов лишний раз поебаться с типами, чтобы потом не ебаться со всем остальным.

Ответы287867292042

31 окт, 12:31 513 1287468

Братишки, а что вы последнего написали на Хаскеле кроме очередной библиотеки для Хаскеля?

Ответы287699

31 окт, 14:56 514 1287534

Проорав
https://youfio.ru/name/ХАСКЕЛЬ.html

31 окт, 19:01 515 1287699

>>1287468
>на Хаскеле кроме очередной библиотеки для Хаскеля
Это ещё зачем?

31 окт, 23:14 516 1287867

>>1287352
А чем это все лучше обычного языка со строгой статической типизацией?

Ответы287907287963

1 ноя, 01:26 517 1287907

>>1287867
Еще больше строгой статической типизации

1 ноя, 08:07 518 1287963

>>1287867
Во-первых, тем, что система типов гораздо более выразительная, причём настолько, что дальше идут разве что зависимые типы. Из всех production-ready языков у хаскеля типы наиболее понтовые.
Во-вторых, вообще, редкий язык предоставляет такие возможности для автоматической генерации кода. Это что-то на уровне лисповых макросов, только половину работы компилятор делает самостоятельно, глядя на типы.

9 ноя, 01:01 519 1292042

>>1287352
Все разговоры о корректности в контексте хаскеллевской системы типов могут заставить человека думать о какой-то магии, которая сама умеет отлавливать ошибки в программах. Это не верно, Хаскель никак не страхует от ошибок в алгоритмах. На самом деле Хаскель не про корректность, а про декомпозицию программ. Библиотеки для Хаскеля - это конструкторы, из которых можно собирать что угодно. А "сильные гарантии" - это гарантии того, что ты правильно комбинируешь детальки этих конструкторов. Лисп - это тоже конструктор. Но Хаскель - это LEGO, который не позволит тебе соединить детальки неправильно. А Лисп - это The Incredible Machine, в котором результат ты узнаешь только после того, как нажмёшь на кнопку Play.

Ответы292104

9 ноя, 01:03 520 1292044

>>1287145
>разумнее взять Эрланг
С хуёв ли разумнее? В Эрланге только довольно убогая модель акторов, в Хаскеле куда больше возможностей для построения различных примитивов синхронизации, в том числе поддерживающих автоматическую композицию.

9 ноя, 07:13 521 1292104

>>1292042
Всё так, гарантии обеспечиваются системой типов. Но тип - это частичная спецификация, и иногда из одного только типа можно сгенерировать подходящий терм, корректный по построению. Вполне себе магия тащемта.

Ответы292668

10 ноя, 04:42 522 1292668

>>1292104
магия - это то, что ты не понимаешь

10 ноя, 14:07 523 1292797

Помогите, плизки, найти ошибку
рекурсия ++ рекурсия - работает
http://tpcg.io/TT6zaU
(рекурсия : рекурсия) : [] - не работает
http://tpcg.io/UGqpCH
Что я делаю не так?

Ответы293403

11 ноя, 10:35 524 1293403

>>1292797
Конструктор (:) принимает голову списка и хвост списка. Оператор (++) принимает два списка.

Ответы293709

11 ноя, 19:20 525 1293709

>>1293403
Спасибо копетан

Ответы293750

11 ноя, 20:38 526 1293750

>>1293709
Пожалуйста, обращайся.

Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 12 ноября 2018 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.

« /pr/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion