Этого треда уже нет.
Это копия, сохраненная 12 ноября 2018 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
2 1077273
>>1077220
Перфоманс хаскеля трудно измерить в принцпие из-за встроенной ленивости, он может по скорости в догонять языки без GC, а может взять в рот и питухона.
В принципе это есть один из реальных недостатков хаскеля
3 1077283
Спалите небольших проектов (или больших, но разбитых на множество небольших) на хаскеле, по которым можно хорошенько разобрать язык. Что-то типа https://github.com/uutils/coreutils.
5 1077289
>>077283
https://github.com/jystic/hadoop-tools/tree/master/hadoop-tools
Ну вот неплохой пример. Хотя не знаю что там спаливать. Программа на хаскеле это цепочка функций, которая внезапно, обрабатывает данные.
Вот и весь секрет. Остальное собсно твой скилл кодинга, алгоритмов, умение создавать композиции, которые, в принципе - оторваны от парадигмы
6 1077291
>>1077214
С такими вопросами в ПХП/Java тред.
7 1077293
>>077289
Спасибо, я знаю, я лиспер.
Просто по такому коду быстро въезжаешь в язык, удобно. Если взять сразу какой-нибудь pandoc, то неделю потратишь только на то, чтобы понять связи между частями проекта (образно говоря), вместо того, чтобы учиться на кусочках кода.
8 1077318
ДВА ХАСКЕЛЛОТРЕДА НА НУЛЕВОЙ!
9 1077377
>>077271 (OP)

>Maybe Haskell-тред


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

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



За что оправдываться-то?
12 1078595
>>077467
Ох и вбросил так вбросил
13 1078605
>>077670
ну наверное на то что наивное решение на хаскеле пососало немытых хуйцов в производительности. Но чо поделаешь, язык не сильно под числодрочение и скриптование заточен.
14 1078807
>>078605

> язык не сильно под числодрочение и скриптование заточен


Ага. Так за что оправдываться-то?
15 1078839
>>077467
Я правильно понимаю, что он в одной куче сравнивает скомпилированные программы на Го и Сях и интерпретируемые программы на хачкеле, питоне и ноде?
p0001.jpg136 Кб, 808x1080
16 1078974
The Haskell School of Expression (2000, Cambridge).djvu
Версия с вшитым оглавлением. Теперь это можно читать — http://m.turbobit.net/tj2jrpany0vy.html
17 1078977
>>078839

>интерпретируемые программы на хачкеле


Так-так, что тут у нас?
18 1078995
>>078977

>ghc -O2 -o main Main.hs


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

> Начинай с 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 1079166
>>077467

> October 24, 2012


Давай ещё раз.
22 1079167

> Изучи себе хаскель во имя великой справедливости


Вот да, нудновато, многабукав, и волшебно уметь в хаскель не начинаешь.
23 1079314
Хаскел тред, все в монады
24 1082972
бамп
25 1082998
>>077467
Впервые вижу сколь-либо интересный аргумент за безтиповое программирование, хотя все равно звучит похоже на "нахуй нам ваши типы, мы в болоте посидим"
26 1085202
Бампецкий
27 1086816
>>077467
Мы дрочим на монады, а не на строки.
28 1087177
Какие преимущества у Haskell перед OCaml кроме никому не нужной ленивости и чистоты?
29 1087210
>>087177
Тайпклассы поудобнее?
Ну а ленивость и чистота для кого-то — серьезное дело.
30 1087377
>>087177
.+ .* .- ./
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
32 1087488
>>087479
10 из 10
33 1087501
>>087479
Проиграл.
34 1087604
>>087479
Почему-то больше проиграл с того, как safeTrace реализована через safePerformIO. Напомнило fizzBuzzEnterpriseEdition.
35 1088712
Посоветуйте учебник по хаскеллю на руззком, прошу.
36 1088715
>>088712
https://www.ohaskell.guide/
+ ищи русский перевод Learn you a haskell
Это тебе не джава, без английского далеко не уйдешь.
37 1088716
>>088715
Ниче, прорвемся.
спасибо
38 1089087
>>078974
Зачем выкладывать книги на помойках, если есть либген? (Залил бы туда, но мне лень)

>>088712
Учебник от Anton K попробуй
https://anton-k.github.io/ru-haskell-book/book/home
39 1089101
http://www.seas.upenn.edu/~cis194/spring13/lectures.html
А вот это как? Разбирался в хачкелле кто по этому материалу?
40 1089107
>>088712

>на руззком


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

Не читаю на пидарашкенском since 2007
41 1089349
>>089107
Я ни в чем не уверен в этой жизни.
42 1090304
>>089101
Аппликативные функторы хорошо зделоны.
43 1093427
Бамп
44 1095138
>>077271 (OP)
Есть ли фриланс на хаскеле?
45 1095378
>>095138
Есть.
maxresdefault.jpg57 Кб, 1280x720
46 1095511
47 1095514
>>087177
Я вот тут от балды написал прикладной 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, а не требуют запуска в нативных тредах или переписывания, как окамле (я не говорю про качество самих драйверов еще).
47 1095514
>>087177
Я вот тут от балды написал прикладной 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, а не требуют запуска в нативных тредах или переписывания, как окамле (я не говорю про качество самих драйверов еще).
48 1095587
>>095514

>6) 90% из того, что я пишу в окамле руками, в хаскелле уже есть


А ты какой стдлиб используешь, братишка?
14315047902312.jpg21 Кб, 349x356
49 1095589
>>095514

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


> языку 25 лет


> это временно

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

Алсо, тайпклассы - зло.
51 1095624
>>095514
это паста 2010 года?
52 1096135
>>095378
В него реально вкатиться?
53 1096259
>>096135
Смотря кому.
54 1096389
>>096259
А кому нереально?
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 доступна значительная часть плюсов продвинутых систем типов, но при этом не приходится преодолевать их ограничения. Зачем же использовать что-либо более строгое?
56 1096999
>>096877

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


Затем, что есть clojurescript.

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

>рефакторить тысячи строк кода без единого теста


Ээ... ты о чем?

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


1 + "2" уже посчитал?

> Макросы? Есть сахарок, если сильно надо.


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

> Иммутабельность? Ее нет, но ее легко эмулировать.


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

> React+redux тоже состояние не теряют


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

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


Нет. Вполне рабочий инструмент. Едиственный момент - не надо путать тайпклассы с интерфейсами из ООП, например. Интерфейс - это набор методов. А тайпкласс - набор прведений.
60 1097464
>>097447
Тайпкласс - это имплицитная загрузка кода. Неявное поведение == зло. Алсо, ты постом промазал чуток.
61 1097543
>>097464
Поведение всегда явное, подключение происходить неявно. Не нужно смешивать.
Тайпклассы зарекомендовали себя, как один из лучших паттернов, отличная замена антипаттерну "наследование"
62 1097586
>>097464

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


На ассемблере пишешь?
63 1097615
>>097586
Помню в школе паскаль преподавали, так и говорили.
64 1097682
>>097543

>Не нужно смешивать.


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

> антипаттерну "наследование"


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

>>097586
Пошел вон из треда.
65 1097895
Например в языке Scala есть и то и другое. В простейших ситуациях можно использовать наследование, но когда нужен вариант более лучший, ну или скилл у программиста подлиннее, используют тайпклассы.
66 1097897
>>097895
Два анальных изнасилования этому господину джаварабу.

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

Если кто-то еще хоть раз скажет "наследование" в этом треде, я пукну
67 1097941
>>097897
Полностью с тобой согласен.
68 1098248
>>097897
Другой пример. Ocaml, все гордятся своими модулями, а на деле в большинстве случаев имитируют тайпклассы, которые только кидают руками. А во влажных мечтах хотят полиморфизма, ждут модульных имплицитов, потому что писать +. и print_string не солидно.

Да, я не джавараб, никогда не писал на джаве, лишь интересовался скалой. Я таки вкатываюсь в окамл, ибо в жизни не хватает точечек и нижних подчеркиваний
69 1098290
>>097897
Если наследование такое говно, то как ты будешь моделировать объекты, которые в жизни реально друг от друга наследуются (типа person/manager/employee и т д)?
70 1098291
>>098290
Это и в жизни скорее тайпклассы, чем наследование
71 1098305
>>098290

>в жизни реально друг от друга наследуются


А вот и ООП-головного-мозга подъехало. И понесло какую-то чушь как и всегда.
72 1098312
>>098290
Ну, например, так же, как это делают разработчики игровых движков еще с середины 90-ых - с помощью композиции. Но ооп-манька об этом ничего не слышала, у нее же наследование вместо мозга.
73 1098327
>>098290
В жизни хорошо наследуются только наследства.
74 1098331
>>098312
>>098305
Не обоссывайте, я просто интересуюсь. Сам пишу на скале, че такое тайпклассы знаю.
75 1098448
>>098331

> Не обоссывайте


Хорошо, но только если ты пояснишь, каким образом Менеджер наследуется от Человека. Менеджер - это такой биологический подвид человеков, я правильно понял? А Батя - другой подвид, так? То есть у тебя с твоей еотовой может родиться либо Менеджер, либо Батя, ну либо просто абстрактный Чоловiк, так?
76 1098505
>>098448
Ну не так написал, скорее manager - это подвид employee.
77 1098510
В принципе, я понял. С одной стороны, если использовать композицию вместо наследования, будет как-то неестественно, что у Manager есть поле Employee. С другой стороны, если никогда не использовать наследование и неявно предполагать, что под manager и employee имеется в виду то, что в ооп назвали бы ManagerData и EmployeeData, то не так уж это и плохо. А поведение реализуется через тайпклассы. Ну понятно.
78 1098512
>>098510

>что у Manager есть поле Employee.


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

> неестественно


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

> А поведение реализуется через тайпклассы.


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

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

>https://pastebin.com/T0qJen1Y


Зойчем? data Node = хуй | пизда, какие классы вообще?
81 1099300
>>098913
Только с версии 3.0 в скалку заедет, пока приходится наследовать
82 1099318
>>099300
Ээ, так кейс-классы - это как бы абсолютно то же самое, что дата в х-ле, просто с нескучным синтаксисом для джава-господмакак, не?
83 1099325
>>099318
По сути да. Просто подъедет сахарок и можно будет не писать бойлерплейт sealed trait case class case class
GopnikHaskMois.JPG32 Кб, 179x254
84 1106443
Жабакодер репортинг ин, решил изучать ФП, в этом треде буду решать упражнения из SICP. Пофиг, что они для схемы, в этих ваших ленивостях и гомоиконностях вся равно ничего не понятно.

https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-10.html
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
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
86 1106514
>>106449
Макаба сожрала звездочки же. Пастебин пасти. Алсо, мне кажется, или в последнем ты что-то намудрил?
87 1106597
>>106514
М, и правда сожрала. Завел фейкогитхабчик, буду туда постить - 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
ch1-Z-G-3.gif165x36
88 1106598
Упражнение 1.2.

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

https://github.com/functional-experiments/sicp/blob/master/exercise_1.02.hs
89 1106627
>>106597
Еще бы | выровнять.
90 1106628
>>106598
На х-ле это, конечно, выглядит инфернально.
91 1106845
>>106627
Чего-то пока не определился с отступами, какие-то неочевидные требования к ним в .hs файлах.

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

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

https://github.com/functional-experiments/sicp/blob/master/exercise_1.03.hs
92 1106884
>>106449
В чем смысл этих упражнений по написанию неидиоматичного кода?
93 1106949
>>106845

> sqsum1 a b c = res where


> ...


> res = foldr (+) 0 squared


АСТАНАВИТЕСЬ

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

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

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

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

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


И тут ты такой - аргументируешь.
98 1107205
>>107163
Комбинаторы == функции высшего порядка. Я имел в виду |>.

Дело не в одной строке (записывай в несколько, если хочешь), а в абсолютно лишних и засоряющих код именах. 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

Эх, поставить х-ль да присоединиться к тебе, что ли?
99 1107206
>>107166
Господи, что за наркомания? Оно вообще компилируется?

aPlusAbsB a b = (if b > 0 then (+) else (-)) a b
100 1107207
>>107190
Аргументировал же уже где-то там выше. Неявное поведение, нелокальные эффекты, глобальное состояние of sorts.
101 1107211
>>107206
А если третий вариант появится - то вложенный if делать?
102 1107217
>>107163
Почему бы не писать сразу нормально? Ну, например, очевидно, что foldr для простых арифметических операций нахуй не нужен, что в cond'е потребности нет в виду наличия guard'ов и т.д.
103 1107222
>>107205
Т.е. это такой оператор "задом-наперед":

(|>) :: 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]



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

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

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



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

(+ 6 7 a)

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

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

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

Про cond - согласен.
105 1107239
>>107227
Нет там списка, по крайней мере явно. Ну и блджад, кто ж дословно-то переводит?

>(+ 6 7 a)


6 + 7 + a

>(fold-right + (list 6 7 a))


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

>>107222

>"задом-наперед":


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

> можно синтаксис менять так просто


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

> Это какое-то проявление ненависти к скобкам/лиспу?


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

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


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

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

>его интент


Хоспаде, что за рунглиш?
109 1107244
>>107242
А сочетания "мой компьютер" или "ее вагина" тебя не смущают?
110 1107263
>>107244
С заимствованием терминов, названий новых вещей ещё можно смириться, но вытеснение инородными обычных разговорных слов выглядит просто отвратительно. Примерно так же, как foldr (+) или cond в коде того анона.
111 1107370
>>107263

>названий новых вещей


>вагина


Ололо, девственники в треде!

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

Алсо, я не уверен, какое слово ты предлагаешь использовать вместо. "Намерение" не совсем подходит.
Vlad v rep-igre.png355 Кб, 1047x607
112 1107381
>>107263

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



Изи-изи, эт не рил ток, синк эбаут ит, мэн.
113 1107436
>>107240
Посмотрел еще раз код, я понял в чем проблемы.

С 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 = ...

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

А выравнивание гардов - учел.
113 1107436
>>107240
Посмотрел еще раз код, я понял в чем проблемы.

С 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 = ...

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

А выравнивание гардов - учел.
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 - ленивость не помогает.
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 - ленивость не помогает.
115 1107454
>>107436

>С foldr (+) ... - вместо обычной суммы.


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

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

>>107439
В четвертый раз говорю, что для гардов не нужен 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

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

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

>>107439

>Так как if/guard в хаскеле - short-circuting, то p никогда не выполнится (dead code elimination все дела).


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

> Что интересно, "test p 0" успешно вешает runghc


Потому что ты аргументы местами перепутал, должно быть test 0 p.
116 1107461
А, ну и алсо:

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


- это не функция.

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

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



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

>>107454

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



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

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

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



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

>>107461
Лол, а что это? Я думал в хаскеле все что в таком же виде как функция объявляется - все будет функцией.
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)))

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

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 точно было все лениво.
120 1107692
>>107688
Перечитал wiki, про short-circuit условие неправильно написал (он не влияет), это then и else должны по разному выполняться.
121 1107743
>>107686

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


АААААААА СУКА БЛЯДЬ ТЫ ИЗДЕВАЕШЬСЯ НАХУЙ?! КАКАЯ НАХУЙ ФИЧА, Я ТЕБЕ УЕБУ СЕЙЧАС, БЛЯДЬ! ТЫ ТАМ ПИШЕШЬ ПРО КУСОЧНЫЕ ФУНКЦИИ, А Я ТЕБЯ ГОВОРЮ ПРО ГАРДЫ! СУКА, БЛЯДЬ! ИЗДЕВАЕШЬСЯ, СУУУКААА?! 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, БЛЯЯДЬ, КАК ЖЕ МНЕ ОТ ТЕБЯ БОМБИТ, СУКА БЛЯДЬ ПИЗДЕЦ, ААААААААА
122 1107746
>>107686

>Это чтобы мимокрокодилы не пугались от вида простыней на нерусском.


Ну, английский-то в х-ль-треде все, думаю, знают.

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


Ээ, лол, жестокий ты.

> А он есть в открытом доступе?


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]
123 1107750
>>107688

>В итого сделал через лямбды


Чувак, но это же значит, что ты не понимаешь, как работает ленивость в х-ле - то есть как раз материал этой главы, понимание которого и призвано проверить данное упражнение.
124 1107760
О г-ди, целый тред ебателей интов и флоатов через гланды в жопу. Извращенцы с нечитаемой хуйней негодной ни на что, кроме вычисление ряда фибоначи новым, необычным способом.
125 1107893
>>107750

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



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

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

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

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

Это похоже на правду?
126 1107894
>>107760
Не, не только фибонначчи, еще и аккерман можно EJB писать, деплоить их на апп-сервера и считать фибоначчи через hadoop и не тормозить - https://github.com/typelead/eta
127 1107895
>>107743
Чистый, понятный и хорошо структурированный код же, что тебе не нравится, в Java все так делают - http://shitcode.net/135
128 1107943
>>107895

>Чистый, понятный и хорошо структурированный код


>Используется concrete класс


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

>>107894

> foreign import java unsafe "@static java.lang.System.getenv"


> getEnv :: String -> IO (Maybe String)


Смищно. Ненужно. Скалка.

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

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



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

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

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

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

> все выражение сразу раскрывается в дерево


При чем тут деревья какие-то, откуда ты это вообще взял? Аппликативный - при вызове вида (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).
132 1108406
>>108110

>рекурсивность я пока еще не вкурил, и вообще эта ленивость пока тяжело воспринимается.


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

Грубо говоря, представь, что каждый 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 шага), и потом возвращает то значение вершины, которое у нас получилось после этих шагов (уже без цикла!).

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

>рекурсивность я пока еще не вкурил, и вообще эта ленивость пока тяжело воспринимается.


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

Грубо говоря, представь, что каждый 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 шага), и потом возвращает то значение вершины, которое у нас получилось после этих шагов (уже без цикла!).

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

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

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

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

Сделал

git reset --hard >>107686

и ушел решать заново пример про Алиссу П. Хакер
alice.jpg93 Кб, 750x545
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 параметра. В пролетарских языках в таком случае надо будет передавать замыкание и явно его вызывать где-нужно.
alice.jpg93 Кб, 750x545
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 параметра. В пролетарских языках в таком случае надо будет передавать замыкание и явно его вызывать где-нужно.
135 1109396
>>109387

> 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)
Макаба наверное проебет, но тыпонел.
136 1109426
>>107760
Ну если для тебя это новое и нечитаемое, желаю скорейшего заполнения пустот в знаниях, иначе стыдно называть себя программистом в 21 веке.
1465633961186362310.png103 Кб, 300x298
137 1109455
>>077271 (OP)
Объясните мне, зачем надо было вводить тайпклассы? SPJ не осилил старую-добрую перегрузку, как в C++? Нет, я правда не понимаю.
138 1109457
>>077273
Да потому что, блядь, нормальной модели рантайма нет. Только гуманитарные словоблудия, как у ван Россума в доке. f x y - и догадайся, мол, сама, во что эта хуйня выльется и сколлько тактов займет. Бесит!
139 1109458
>>107686

> "оценка аппликативного порядка" - классный термин по-моему


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

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


ссаное говно потому что

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

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

смекаешь? По сигнатуре видно что sum работает не с любым a
141 1109539
>>109474
Так ведь если я подсуну ей [NonNum], она все равно не скомпилится, не? Ошибка только будет малопонятной. И ради понятной ошибки стоило отказываться от краткости кода? Или как?
142 1109551
>>109539
Ты действительно считаешь, что ограничение на тип влияет на краткость кода? То, что ты бы раньше писал в комментах ко входным параметрам функции (а если не писал, то вон из проффесии), теперь ты пишешь в сигнатуре.
143 1109554
Есть хаскелл без кучи символов?
145 1109577
>>109551
Верно и обратное. Теперь для любой перегрузки, для которой имя функции совпало чисто случайно, нужно писать тайпкласс:
[code]
get :: Form -> FieldID -> String
get :: Car -> ShowmeterID -> Float
[/code]
Либо писать префиксы (Form.get и Car.get). Либо отказываться от перегрузок вообще (привет lift, liftM, liftM2, liftM_ и т. д.).
146 1109596
>>109396
По скобкам - согласен, дальше поправлю. По отступам - свой супер-стабильный .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

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

> имя функции совпало чисто случайно


Н - неймспейсы.
148 1109602
>>109599
Не нужны. Мне, как правило, нужно оба неймспейса с одинаково называющимися функциями юзать.
149 1109603
>>109602

>Не нужны.


Пхп-тред вооон там.

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


Подумой. Ты походу не понимаешь, что такое неймспейсы.
150 1109606
>>109603
Ну,вот тебе в продолжение моего предыдущего примера:

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
151 1109607
>>109606
И что это? Зачем ты постишь говнокод, который не скомпилируется?
152 1109610
>>109607
Тред читай. Вот тебе пример, где нужны две функции с не связанными друг с другом сигнатурами, но с одинаковым именем. Понятно, что он не компилируется, потому что и Car, и Config надо добавлять в тайпкласс Gettable where get :: .... Вопрос: нахрена так сделано, почему без тайпкласса нельзя?
153 1109612
>>109610
Ты какой-то долбоеб. Ты не понимаешь, что такое неймспесы. И что такое тайпклассы тоже не понимаешь. Про первое - гугли, про второе - выше ссылки >>109575 запостили.

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

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


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

Ты так и будешь кичиться своими тайными знаниями новых, более лучших определений общеизвестных терминов или будешь по де съебешь уже из треда? Почему я в C++ могу написать вот такое (и при ошибках типизации оно даже будет корректно показывать, где ошибка), а в Хачки нет?
155 1109622
>>109621
*Зачем такмбыло сделано?
156 1109626
>>109621
Потому что С++ - это огромная куча говна, в которую понапихано все, что туда можно было понапихать, и которая дает тебе тысячу и один способ выстрелить себе в ногу, не? Мимокапитаночевидность, ага.

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


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

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

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

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


Кому должны?

> Тайп-классы нужны для


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

> это неочевидный и не запрашиваемый юзером рантайм оверхед


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

> В чем твой вопрос?


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

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

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

Так понятнее?
158 1109674
>>109662
Ты кокойто тупой.
Предлагаю тебе для начала осилить вооот эту страничку на википедии.
https://ru.wikipedia.org/wiki/Полиморфизм_(информатика)
Потом возвращаться в тред (лучше не надо).
159 1109687
>>109577
В твоем примере нет полиморфизма вообще. Просто две разные функции с разными сигнатурами. А раз функции разные, то и называться они должны по-разному.
160 1109771
>>109687
См. >>109662.
1. Кому должны?
2. Что, помимо (возможно) невнятных сообщениях об ошибках в других местах может произойти, если компилятор позволит их назвать одинаково?
161 1109777
>>109662
Ты какой-то тупой.

> Кому должны?


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

> похуй чего.


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

> Где ты там рантайм оверхед увидел?


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

> Почему в Хаскеле запилили ад-хок полиморфизм, но не запилили никакого другого полиморфизма вообще ни в каком виде?


Запилили, дебил ебаный. Какой же ты тупой.

> Почему нельзя


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

> Почему нельзя было сделать, как в инглише


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

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


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

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


Ты когда используешь метод доведения до абсурда, пооверяй хоть, что получается в итоге. Вспоминай, как работают перегрузки в Java. Там если две функции имеют неразличимые сигнатуры, компилятор ругается.
1479467881169314652.jpg140 Кб, 400x518
163 1109967
Короче, попробую сам написать тайпчекер. С параметрическим и ад-хок полиморфизмом.
164 1109968
>>109961

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


>> Кому должны?


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


Где ты тут видишь хоть слово про перегрузки в Джаве, дебил ебаный? Бери учебник по русскому языку и учись читать.
jojo.png462 Кб, 811x768
166 1110167
>>110099

> тыкнули его в то, что он потерял контекст


> кидает ссылку на статью "Контекст"

167 1119574
Почему работает negate (negate 3), но не negate -3 ?
168 1119575
>>119574
Потому что нельзя из функции вычитать число.
169 1119583
>>109771
1. Компилятору и коллеге-программисту.
2. Компилятор все равно будет вынужден декорировать функции, из-за чего будут страдать вообще все, как страдают пользователи плюсоводских блябляотек.

>>109662

>Почему в Хаскеле запилили ад-хок полиморфизм, но не запилили никакого другого полиморфизма вообще ни в каком виде?


Параметрический полиморфизм ты за полиморфизм уже не считаешь?
А перегрузка - это самый что ни на есть адхок полиморфизм.
15131972269590.png220 Кб, 750x414
170 1119879
А почему считается, что для профессионального программирования на Хаскеле нужно изучать теорию категорий? Ведь она объективно не нужна для этого дела. Ведь в языке нельзя даже какую-нибудь свою категорию определить.
171 1119918
>>119575
А я думал, что - это alias для negate, и вычитание числа из функции выглядело бы как (-3) negate, т.е. функция в даном случае (-3), а число - просто -3.
172 1119919
>>119918

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

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

Отсутствует только третий вид сабтайп-полиморфизм из-за его сложности.
175 1120019
>>119918
Минус в хаскеле на особом положении. (-3) - это синтаксический сахар для negate 3, а не частично примененный оператор (-).
176 1120021
>>119879
Можно. Импортишь Control.Category и хоть обопределяйся.
177 1120073
>>120021
Смешная шутка.
ch1-Z-G-5.gif60x32
178 1121006
>>109596
Упражнение 1.8.

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

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

https://github.com/functional-experiments/sicp/blob/master/exercise_1.08.hs
179 1121092
>>121006
О, а я думал ты там умер уже. Добро пожаловать снова!
180 1121543
>>121092
Разгребал всякое г-но, что под н.г. накопилось - ынтырпрайз, он бессмысленный и беспощадный. Вроде разгреб, и можно дальше ерундой заниматься.
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
182 1121547
>>121544
Эта совсем простое, но интереснее предыдущих. Очевидно, что в первом случае рекурсия не хвостовая (так как результат рекурсивного вызова не возвращается из функции) и стек будет пухнуть.

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

> большинство реализаций обычных языков (включая Аду, Паскаль и Си) построены так,


> что интерпретация любой рекурсивной процедуры поглощает объем памяти, линейно рас-


> тущий пропорционально количеству вызовов процедуры, даже если описываемый ею про-


> цесс в принципе итеративен. Как следствие, эти языки способны описывать итеративные


> процессы только с помощью специальных«циклических конструкций» вроде do, repeat,


> until, for и while. Реализация Scheme, которую мы рассмотрим в главе 5, свободна


> от этого недостатка.



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

>будет "медленна" на самом деле нет, рантайм все оптимизирует


Шта? TCO не влияет на скорость, он влияет на сложность по памяти. Рантайм тут ни при чем.
184 1121855
>>121591
Если у тебя происходит алокация стека функции на каждую итерацию, вместо переиспользования, скорость тоже страдает. Если чтобы переделать в хвостовой вариант, нужно передать только число аргументом, это добавит скорости.
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)
186 1122243
>>122242

Рассмотрим следующие процедуры, где 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
OyVey.jpg52 Кб, 504x566
187 1122244
>>122243
Сраный Аккерман, ненавижу этого еврея, на функции (h n) сломал мозг и подсмотрел ответ в решенияx.
188 1122245
>>121591

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



Имелось ввиду, что рантайм Java/JS/PHP на этапе JIT-компиляции перепишет нахрен всю функцию если сумеет, заинлайнит втруху все что только можно и ТСО на простой цикл заменит но не гарантирует этого, так как не Схема
189 1122246
>>122245
:%s/ТСО/рекурсивные тейл коллы/g
15135126627180.jpg118 Кб, 640x640
190 1122803
>>121855

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

191 1122809
>>122243

> foldr (*) 1 [5, n, n]


Лол, до сих пор используешь списки там, где в оригинальном коде никаких списков нет.

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

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

> foldr нинужын



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

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



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

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

>не напрямую связано, но идеи похожие


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

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

> В русском переводе нет коэффицентов 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)
ch1-Z-G-17.gif77x100
197 1124710
Упражнение 1.12.

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

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

https://github.com/functional-experiments/sicp/blob/master/exercise_1.12.hs
198 1124711
>>124710

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

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

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

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


Вообще-то это в питоне листокомпрехеншены есть, прямо как в сабже
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
201 1125316
>>125314

>Докажите



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

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

Наличие в хаскеле 3-х разных операторов для возведение в степень вызвало некоторое удивление.
202 1125485
Вкатываюсь в функциональное программирование. Посоветуйте книжечки про ФП.
204 1125688
>>125485
Haskell From First Principles 2017 года
205 1126991
Только начал писать что-то более серьезное, нежели fib, и сразу же обосрался с этого хуцкеля. Вкратце: нужно генерировать бинарник с порядком байтов big endian. Ну хули, дело простое, ищу в base функции типа fwrite и hton*, или хотя бы что-то похожее. Знаете что я нахожу? - Ни-ху-я. Саймону это нахуй ненужно. Зачем вообще что-то выводить, ведь можно просто играться в анус чистыми функциями и впаривать это индусам из мелкомягких/книгалицо. Ладно, думаю, может это я такой долбоеб не нашел, поэтому гуглю данную проблему, и везде люди предлагают использовать сторонние либы от васянов, напомню, чтобы записать свапнутое число в бинарник. Нашел самую легковесную либу, линканул статически: плюс 31824 байтов к весу исходника. Дальше меня ожидает еще больший пиздец?
зы А ведь я до этого стирал шишку на этот язык.
206 1127015
>>126991
Байтоеб обезумел, сможешь ли ты совладать с ним?

Я надеюсь, что ты троллишь - в таком случае это тонко и остроумно, снимаю шляпу.
207 1127030
>>126991
А самому что-нибудь лёгкое написать никак?
208 1127034
>>126991
Какой конкретно тип данных нужно записать?

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

А так ответь на мой вопрос - постараюсь помочь.
209 1127057
>>127015
Я просто ебанулся и захотел на хуцкеле писать всё: небо, землю и даже аллаха. Но столкнулся с реальностью, о которой говорит >>127034 и меня разворотило.
>>127030
Как. Да только это ебля с битовыми сдвигами. В фп биты теребить, ты совсем черт?
>>127034
Любой Word*, отличный от Word8, например.
210 1127061
>>127034
Пока вот такое решение:
import Data.ByteString.Builder (hPutBuilder, word32BE)

f :: Word32 -> IO
f = hPutBuilder stdout $ word32BE
211 1127064
>>127061
Фикс:
f :: Word32 -> IO ()
f = (hPutBuilder stdout) . word32BE
212 1127078
>>127057

>Я просто ебанулся и захотел на хуцкеле писать всё


В этом нет ничего плохого, но ожидать от высокоуровнего языка функций для работы с байтоебством в стандартной библиотеке как-то глупо, не находишь?
213 1127194
Лично моё мнение: Haskell для парсинга. Ну и для параллельных вычислений. Кто-нибудь может расширить список, я уверен, но это то, для чего я его использую.
214 1127305
>>127078
Глупо то что ты написал. А хорошая стандартная библиотека - это норм.
215 1127443
>>127305
По такой логике в хорошей стандартной библиотеке должен быть гуи-тулкит, хттп-сервер и rdbms. До свидания.

>>127194
Компиляторы же!
216 1127459
Я еще только вкатываюсь, и не понял вот чего: тут что, типы не имеют типа Type, как в питоне? Или просто :t в ghci работает только на дата конструкторы?
217 1127587
>>127459
Type constructors или datatypes объявляются при помощи `data`. Алиасы - при помощи `type`. Через `:t` можно смотреть тип чего-угодно, кроме тайпклассов. Функции или value constructor-а например. Для typeclasses юзается `:info`
218 1127588
Пацаны, а кто-нибудь на работе кодит на хаскеле?
219 1127591
Впервые за последние джва года зашел в /pr и внезапно увидел хаскель тред. В мое время такой хуйни не было. Язык хайпанул чтоль?
220 1127603
>>127591
Сейчас многие языки стремятся включить мощные абстракции ФП в стандарт: C++, Java и т. д. Также популярность возросла благодаря таким языкам, как Scala, Go и т. п.
221 1127605
Анон, а почему бы не придумать Хаскелю маскота, вроде "Лямбда-тян"?
Понимаю, с такими идеями мне сразу в /b/ надо.
222 1127687
>>127605
Да вы заебали, в одном треде шлюха вниманиеблядит, в другом шмара в оп-посте, теперь еще и сюда эту хуйню ТЯН ТЯН ПИСЕЧКА ТЯН тащат, пиздец просто.
223 1127698
>>127687
Двачаю. Хаскель - серьезный язык для и серьезных умных людей и это не сарказм. Мы тут ерундой не занимаемся.
224 1127701
Начинайте читать хаскелль с Haskell Programming: From First Principles . Воистину лучшая книга по хаскеллю для вкатывания.
330990785 Кб, 1000x1300
225 1127772
226 1127816
Есть вообще приемлимый способ профилирования, если код использует стороннюю библиотеку? Там вроде надо cabal install $packagename --enable-library-profiling, но оно требует перестановки зависимостей, и в итоге все рушится!
227 1128063
>>127701
А чо в ней такого крутого? Чем лучше "во имя добра"? Реквестирую рецензию, короче.
228 1128068
>>127588
Зефирыч кодит.
229 1128215
>>128068
Хуй сосет губой трясет - он на крестах сейчас.
230 1128240
>>128063
В отличие от "во имя добра", в ней тебя проводят в первую очередь по абстракциям - посмотри содержание, как там список глав выглядит. После объяснения идут упражнения в конце каждой главы - в них ты обращаешься с этими абстракциями на практике. Это, как мне кажется, более здравый взгляд на основу языка, которой являются именно эти самые абстракции, а не способ написания hello world.
От "во имя добра" у меня осталось впечатление, что я могу воспроизвести примеры, которые там есть, и вроде понимаю, как они работают, но как только я пытаюсь сконструировать из данной мне инфы что-то сложнее этих примеров - не могу, сразу начинаются ошибки и появляются вопросы, ответы на которые в книге найти трудно. Может, я просто тупой, но сейчас я радуюсь Haskell Programming From First Principles и чувствую, что я не тупой, а просто нихуя не знаю, но могу узнать.
231 1128326
>>128063

> Чем лучше "во имя добра"?


В воимядобра даже нет главы по монад трансформерам - одной из центральных фич.
232 1128905
>>128240
Согласен с этим господином, даже нечего добавить.
Screen Shot 2018-01-29 at 22.51.28.png48 Кб, 1124x347
233 1128934
Бля, вот нахуя они назвали объявление типа через "data", а алиасы через "type"? Пиздец же как путает потсоянно, что там data constructor, что там type, хуе-мое. Вот в элме все по-человечески, типы через "type", алиасы через "alias", нет такого уебанства и путаницы как в хаскили
234 1129011
>>128240
Естественно, то что это вторая (или больше) книга по хачкилю, значения не имеет.
235 1129024
>>129011
Без "то".
236 1129139
>>129024
Почему? Дай ссылку почитать.
237 1129163
>>129139
Ссылку на грамматическую норму?
Вот тебе цитата из учебника.

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

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

https://ru.wikipedia.org/wiki/Гопник,_Хаскель_Моисеевич
ex1-14.png136 Кб, 640x1542
239 1129201
>>125314

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

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

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

Пикрилейтед из гугла, совпадает с ascii-art'ом из решения.
240 1129224
>>128934
Логика в этом есть. type объявляет только тип, а data - все соответствующие структуры. Ну и у тебя даже на картинке написано: datatype declaration. Логично же?
GopnikHaskMois.JPG32 Кб, 179x254
241 1129226
>>129198

>Хаскель Моисеевич Гопник


>Хаскель Гопник


>Моисеевич


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

Хаскель Гопник смотрит на тебя с интересом и некоторой иронией.
242 1129320
>>127816
надо снести сэндбокс и переставить все заново

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

>> 1129320


Спасибо, попробую stack
ch1-Z-G-19.gif148x26
244 1130921
>>129201

Упражнение 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
245 1130924
>>130921

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

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

>запрет на console.log()


Тащем-то как раз в таких случаях можно использовать unsafePerformIO.
247 1131252
>>131234
Debug.Trace
248 1132929
>>130921

Упражнение 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
249 1132934
>>132929

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

>>131252

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

Упражнение 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
251 1134063
>>133415

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

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

https://github.com/functional-experiments/sicp/blob/master/exercise_1.18.hs
252 1135527
>>127603
А причем здесь Go?
253 1144246
>>134063
Как успехи? Опять на работе интерпрайс разгребаешь?
254 1145755
>>129226

>Моисеевич


>хохол

255 1151722
Какой лучший способ реализовать очередь в ФП?
256 1151733
>>151722
С одной стороны вектор, с другой - список.
257 1153351
>>151733
Почему вектор а не список?
258 1153579
>>153351
Потому что reverse надо делать. Ну и элементы в списке и векторе добавляются с разных сторон, так что чисто визуально удобнее, если ты просто свою очередь просто как пару определишь.
259 1153604
>>153579

>Потому что reverse надо делать


А как делать без reverse?

>элементы в списке и векторе добавляются с разных сторон


Это я не понял.
260 1162601
>>153604
Я, конечно, встрял посреди беседы, но, видимо, здесь идёт речь про конструкцию списков.
Список может иметь только ДВА значения: [] или элемент : список. Т. е. список [1, 2, 3] - не что иное, как 1 : (2 : (3 :[])) (учитывая ассоциативность 1 : 2 : 3 : []). Соответственно, быстрее добавить элемент в начало, чем в конец. reverse же предлагается затем, чтобы хранить начало как конец, т. е. хранить список наоборот. Тогда добавление в конец будет являться, по сути, добавлением в начало. Потом превращаем это в список с помощью reverse. Вот, постарался объяснить.
261 1162602
>>153604
Я, конечно, встрял посреди беседы, но, видимо, здесь идёт речь про конструкцию списков.
Список может иметь только ДВА значения: [] или элемент : список. Т. е. список [1, 2, 3] - не что иное, как 1 : (2 : (3 :[])) (учитывая ассоциативность 1 : 2 : 3 : []). Соответственно, быстрее добавить элемент в начало, чем в конец. reverse же предлагается затем, чтобы хранить начало как конец, т. е. хранить список наоборот. Тогда добавление в конец будет являться, по сути, добавлением в начало. Потом превращаем это в список с помощью reverse. Вот, постарался объяснить.
262 1163171
>>077271 (OP)
В чём профит хаскелля? Кроме оригинального (тм) мышления
И какая основная область применения?
263 1163189
>>163171
людям он нравится за то что сам язык очень маленький и узконаправленный, без попытки объять необъятное и впихнуть невпихуемое. По сути он представляет один основной инструмент - функциональное программирование, который можно задрачивать до бесконечности, потому что инструмент позволяет изъёбываться через 4 пизды и восемь жоп. В то же время людям нравится что не надо отвлекаться на что то лишнее, так как в языке этого нет. Многим импанирует такой подход. Область применения, я думаю это просто игрушка для мозга, которая к тому же позволяет писать некоторые полезные тулзы в купе с чем либо еще, и дающее отдых уставшему от многообразия и лагающей еботни анону.
264 1163786
>>163171
Могу сказать за типизированные функциональные языки в целом: их преимущество в том, что намного легче читать код и рассуждать о корректности, потому что программа напоминает последовательность вычислений как в математике. Это, например, актуально для конкаренси, потому что при написании конкурентного кода возникают хитровыебанные ошибки, которые очень тяжело найти и воспроизвести. Никакие индусские говнометодологии типа TDD, BDD и прочего не помогут, если говнокодить при написании конкаренси, единственный выход - писать нормальный код и доказывать его коррекность. Обычно это не формальное доказательство, а просто пристальное разглядывание кода и доказательство в уме. Но можно заморочиться и провести полностью формальное доказательство корректности того или иного участка кода, записать доказательство в каком-нибудь пруф асистанте типа Coq. Функциональные языки хороши тем, что доказывать корректность кода на них намного легче чем на императивных.
265 1163789
>>163786

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


Дополню тебя: функциональные языки хороши тем, что писать корректный код на них намного легче чем на императивных.
266 1164176
>>163789
Ну тут уже от задачи зависит. Например, когда нужно изменяемое состояние и сайд эффекты, то нихуя не проще. Обычные изменяемые переменные использовать проще чем монаду стэйт.
sage 267 1164190
>>164176
ST или STM, но никак не State. И свои сайд эффекты можешь просто в IO хуячить, никто не запрещает.
268 1164197
>>164176

>изменяемое состояние


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

>сайд эффекты


А какие тут проблемы?
269 1164207
>>164197

> изменяемое состояние


> что это


Это когда одно и то же выражение может дать разные результаты в зависимости от времени. Например, выражение, которое получает элемент из мутабельной структуры данных.
270 1164215
>>164207
Алсо, функциональные структуры данных иногда намного менее очевидны в реализации, чем их императивные аналоги. Про них нужно отдельную книгу читать типа Криса Окасаки.
271 1164349
>>164197

>>сайд эффекты


>А какие тут проблемы?


Попробуй потоньше.
272 1164402
>>164349
>>164215
>>164207
>>164197
>>164190
>>164176
>>163789
>>163786
>>163189

ИТТ петушки, которые на хаскеле никогда не писали
273 1164430
>>164207
Ну так а что это?
274 1164431
>>164349
Как тоньше? Я прямо спрашиваю.
275 1164641
>>164431
>>164430
Все уже поняли, что ты жирный, можешь не продолжать.
276 1164781
Зачем нужен хаскелль, когда есть такой-то оверблюд с такими-то модулями и конпелятором, который в 100500 раз быстрее гэхэцэ?
277 1164825
>>164781
Чтобы писать диссеры и пейперы. Х-ль - чистый и красивый, верблюд - нет. Разные категории.
278 1164828
>>164781
Например, там мультитрединга нормального нет.
279 1164840
>>164828
Уже есть почти скоро будет бля реально отвечаю
280 1172509
Посоны, а есть у кого The Implementation of Functional Programming Languages в нормальном качестве? Бесит этот мутный шрифт, блин.
281 1172619
282 1173300
Ну и как там 2020?

ПЛАНИРУЕТЕ
@
ПРЕДВКУШАЕТЕ?
200px-Slowpoke.svg.png19 Кб, 200x218
284 1173527
>>173300
Ага, уже вот-вот!
285 1173632
2018-04-30081842.png66 Кб, 1084x871
286 1181936
Manning выпустил книженцию.
287 1182193
>>181936
Как то не уверен что она стоит покупки или даже пиратства.
288 1184360
антоны каким рехепх модулем пользуетесь?
что за недоразвитая таблица на оф сайте
289 1184423
>>184360

>рехепх


что?
290 1184935
>>184423
regular expression
291 1185459
>>184935
пользуюсь комбинаторами парсеров, брат жив
regexp забыл как страшный сон
292 1186828
Я чё-то не врублюсь в эти монады, помогите мне пожалуйста!
293 1186924
>>186828
Для начала пойми, монада - это такой моноид (множество с ассоциативной бинарной операцией и нейтралным элементом).
294 1186958
>>186828
А что именно непонятно?
2018-05-11132422.png35 Кб, 970x731
295 1188221
>>186828
Вот эти слайды посмотри, так общую идею уловишь - http://rgho.st/6c9JcSMRF
296 1193043
что-то устал читать решил посмотрел лекцию и не понял одного момента
https://pastebin.com/raw/sFJUDJ3M
зачем там этот аккумулятор?? просто для аналогии с императивными?
или я чего-то не понимаю?
297 1193127
>>193043
Вызов функции занимает место в стеке, аккумулятор позволяет не забивать его попусту.
298 1193806
>>193043
Заменяется вредная рекурсия на безопасную хвостовую.
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
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
300 1194591
>>194449
Не разбирал простыню кода, но вот к чему ты должен стремиться:
shortest :: String -> Int
shortest = minimum . fmap length . words

Разделять идентификаторы в хуцкеле подчеркиванием - это моветон, как по мне. Именования переменных вообще пиздец.
301 1194634
>>194591
Удваиваю. Этот хаскеллист кое-что смыслит.
302 1194740
>>194591

>Разделять идентификаторы в хуцкеле подчеркиванием


Не виноватая я, так на сайте было.

>Именования переменных


А как надо?

Где можно почитать список функций типа words, length?
book-cover-front.png214 Кб, 1530x1980
303 1194817
>>194740

> А как надо?


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

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

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


google: haskell prelude
google: haskell basic libraries

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

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


Да ты чо, а чо у меня система приняла?

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


Там тыща страниц, это там-то нет воды?
А так нормально, её и читаю.
305 1194943
>>194888

> у меня система приняла


Да, я обосрался. Уверен был, что

> = (word_counter + 1)


возвращает позицию наименьшего слова, исходя из названия. letter_counter тогда уж, лол.
packt-haskell-videos.png67 Кб, 711x1620
306 1214960
Отрыл шахту с изумрудами.
308 1217789
>>214960

>Packt


С говном
310 1220715
Сап, в ваш Хаскель вкатываться, если интересует числодробление? Именно реализация мат. части в ЯП.
Слышал, что математики любят функциональное программирование, которое к тому же помогает параллелить, ибо устраняет зависимости между данными.
311 1220735
>>220715
Тащем-то производительные числодробилки подразумевают байтоебство. А если тебе именно в плане покодить то, что изучаешь - да, самое то.
312 1220947
Ну-ка хачелисты, поясните, где я проебался.

Это работает: https://ideone.com/ADh9bm
А тут нет: https://ideone.com/9Q3bDr
1.png2 Кб, 198x34
313 1220952
>>220715
Толстишь
Это говно даже 0.1 на 0.1 умножить не может
315 1221162
>>220715

>числодробление


Тут два пути.
1) По хардкору используешь FORTRAN, пишешь всё сам
2) По хардкору используешь всякие BLAS и LAPACK, которые сами были написаны в фортране, но через обёртки в плюсах или питоне.
316 1221328
>>220947
Короче работать только с подсказками типов, неТруЪ как-то: https://ideone.com/FhZWsA
317 1221518
>>127459
Типы и в питоне не всегда тип `type` имеют. Это стандартный метакласс, и его можно переопределить.

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

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

Пример:

```
Prelude> :k Int
Int :: *
```
319 1221754
>>221328
Ну а хули ты хотел? У тебя тип a должен стать неким m b. Откуда компилятору знать что ты там имел ввиду под b?

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

main = print $ read "5"
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

Че делать? Расходимость так и прёт.
321 1222853
>>221754
какие же компиляторы тупые пиздец просто
323 1223383
>>186828
Монада - это моноид из категории эндофункторов.
324 1223389
>>222853
Вернись в /по/рашу.
325 1223561
>>186828
Монада M это тайп констрактор. Берёшь M, тип a, и получаешь тип M a, у которого есть байнд (>>= :: M a -> (a -> M b) -> M b), ретёрн (return :: a -> M a) и который подчиняется паре простых законов. Всё остальное лишь свистоперделки, которые можно получить из этих двух функций.
Вообще >>188221 годную вещь указал, почитай: https://fsharpforfunandprofit.com/rop/
326 1223735
>>221754
Какой-то хуёвый пример, с read всё понятно, его реализации имеют кучи типов. Во что парсить строку он не может понять.

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

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


Вот смотри, есть 2 варианта реализации monadConcat:

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

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

Вот нахуй тут подсказывать компилятору тип результата?
гифки-jpg-сделал-сам-опять-сжимаешь-ебучий-шакал-1276816.jpeg12 Кб, 312x334
329 1224917
330 1225166
>>223746

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


Нихуя. Нет ограничения на то, что a не может быть вложенным списком. Так что, a может быть чем угодно. И вложенным списком, и хуем в пизде. Из-за этого и неоднозначность.
331 1225222
>>225166

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


Если это вложенный список, то должен обрабатываться "instance (Monad m, MonadConcat m (m a) b) => MonadConcat m (m (m a)) b".

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

>Нет ограничения на то, что a не может быть вложенным списком.


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

>a как ∂


Ну что за почерк
334 1225389
>>223735

> https://ideone.com/8P3ETU


>>223735

>так как типы ([Int] и [[[int]]]) имплементирует по одной монаде


Ты что на хаскеле, что на русском пишешь какую-то хуйню, которую трудно и, порой, невозможно корректно распарсить.
Протрезвей и напиши ещё раз свой вопрос.
335 1226218
Почему ghci не жрет простую функцию типов?
sum' [x] = x
sum' (x:xs) = x + sum' xs
Без sum' :: [Int] -> Int выдает нон еххаустиве паттернс
С определением работает
336 1226222
>>226218
Попробуй вызвать свою функцию от пустого списка и поймёшь в чём суть.
337 1226435
>>226218
Используй моноид Sum и не епи себе моск.
Dh6jBH3U0AAX9tM.jpg159 Кб, 911x1199
338 1226991
339 1234184
Обнаружена вакансия программиста на Haskell http://getshop.tv/ourteam/sr-haskell-developer/
https://hh.ru/vacancy/26915246
hs-learn-curve.png52 Кб, 600x450
340 1235921
341 1236775
>>223735
Я точно не знаю, но думаю, что идея в следующем.

Haskell старается соблюдать принцип того, что добавление новых деклараций не должно ломать старый код. А в данном случае, если ты добавишь новых инстансов, то однозначность нахождения реалиции нарушится.
342 1239410
Сап, хаскеллач.
Подскажи, пожалуйста, как называется паттерн, суть которого состоит в последовательном применении такий функций, как map, filter, reduce. Напрочь вылетело из головы.
Stream API из джавы так же является реализацией данного паттерна.
343 1239429
>>239410
Это паттерн Вызов функций. Ну у тебя есть функция, и ты ее вызываешь. А если хочешь вызвать сразу несколько, то используешь композицию. паттерн блять, лол
Откуда это желание усложнять? Какой нахуй паттерн?
345 1239622
>>239410
producer/consumer pattern

Баззворды собираешь?
346 1239636
>>239410
Т Р А Н С Д Ь Ю С Е Р Ы

а по делу, этот >>239429 прав
но есть (в том числе в хаскеле) довольно много реализаций апи над коллекциями\стримами\етк
помимо трандьюсеров, есть еще обычные итераторы\сиквенсы, есть iteratee, есть линзы (для вложенных конечных коллекций), сюда же можно зипперы по идее добавить, ну и еще куча всего чего я не знаю, можешь посмотреть разные prelude в сабже
347 1239649
>>239636
Объясни зачем нужны трансдьюсеры, чем они отличаются от ленивых вычислений которые уже из коробки в Хаскеле? Давно пытаюсь это понять, может ты сможешь помочь?
348 1239665
>>239649
Трансдьюсеры к ленивости вообще не имеют отношения. Это чисто функциональные трансформации, которые ничего не знают о том, как получившиеся функции будут выполняться - лениво ли, энергично ли, над коллекциями или вообще над чем-то другим. То есть трансдьюсер просто берет одну функцию, которую можно скормить в fold, и возвращает другую. Там есть еще кое-какие детали, но в целом идея думаю понятна.

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

>Там есть еще кое-какие детали, но в целом идея думаю понятна.


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

>Я могу скормить


Не можешь. (+1) ты только в map скормишь.
351 1239699
>>239678
Не можешь, почитай, что такое fold (можешь "tutorial on unversality and expressiveness of fold" навернуть).

Ну и трансдьюсеры композируются и так обычной композицией, лол. А вот reducing functions ты обычной композицией не скомпозируешь, потому что, ну, и типы не совпадут, и есть всякие нюансы типа раннего выхода (ищем элемент, нашли - зачем дальше кушать инпут? выходим), внутреннего локального состояния и т.п.
352 1239717
>>239687
Лол, и правда ведь. Кажется я начинаю понемногу прозревать. Мне казалось это как раз с map связано все.
>>239699

>То есть трансдьюсер просто берет одну функцию, которую можно скормить в fold, и возвращает другую.


И какую он функцию тогда возвращает. Если я допустим скормлю (+).
Как тогда трансдьюсеры композируются?
А можно примеры на Хаскеле, только попроще?
353 1239729
>>239717
Вот такую
(Num a, Foldable b) => a > b a -> a
354 1239805
>>239636
Да, трансдьюсеры, хотел их упомянуть. Но мне казалось, что я пытался вспомнить какое-то другое слово
355 1239877
>>239717
Короче глянь пикрелейтед (rf = reducing function, conj = добавление элемента в список), лень сейчас на х-ле переписывать
356 1239885
>>239877
Обожжи
(empty xs)
Это предикат возвращающий true на пустом списке (почему тогда без ?) или просто пустой список (но зачем тогда нужен аргумент не понятно)
357 1239889
>>239885
Возвращает пустую коллекцию того же типа, что и переданный аргумент. Ну это вообще там необязательно, можешь мысленно заменить на [].
358 1239899
>>239889
Чем это отличается от map (+1) . filter even ?
359 1240106
>>239877
conj добавляет в хвост? Ой пиздец-пиздец.
360 1240309
>>239899
Блядь, ну прочитай еще раз, что тебе пишут. map и filter работают с коллекциями. Трансдьюсеры не работают с коллекциями и ничего о них не знают (смотри код). Можно построить цепочку трансформаций, аналогичую map (+1) . filter even, и она ничего не будет знать и никак не будет зависеть от конкретных коллекций. Можешь потом ее применить к итераторам, ленивым спискам, векторам, асинхронным каналам, еще каким-нибудь хитровыебанным абстракциям - твои map и filter уже будут с ними работать (и притом эффективно) без дополнительного кода. Посмотри определение map в prelude. Потом посмотри определение mapping у меня на пике. Уловил?

>>240106
[] - это вектора (иммутабельные массивы, amortized constant time операции доступа по индексу), а не говносписки. "Пиздец-пиздец" - это как раз списки по умолчанию для всех sequential вещей, привет 80-ые. Как раз поэтому кстати эликсир сосет и никто в здравом уме не пользуется prelude функциями для чего-то кроме хелло ворлдов и факториалов.
361 1240377
>>240309
А можешь мне их типы расписать и алгебры этих самых трансдьюсеров? Может вот тогда то я докумекаю.
362 1240563
>>240377

Ну тебе ведь написали уже (упрощенные) типы. Полные типы по смыслу будут такими же, только все надо обернуть в десять манаток и тайпклассов, чтобы заиметь локалстейт\ранний выход и 0,1,2-арные операторы. Короче, let me google that for you, блядь: https://conscientiousprogrammer.com/blog/2014/08/07/understanding-cloure-transducers-through-types/
363 1246930
Мне нравятся идеи функциональщины, я активно использую ее в работе, вот только я не вижу никакого смысла в именно чистой функциональщине. Точно также как я не вижу смысла в чистом ООП или императивном стиле. Предпочитаю всегда иметь лучшее из всех подходов, а пуризм оставлять недоумкам-фанатикам. Из мультипарадигменных активно использую perl(это любовь навсегда) и js(суровая необходимость). Тем не менее мне нравится время от времени читать код на чистой функциональщине ради того, чтобы "заражаться" другим взглядом на вещи. Это позволяет пересмотреть свой код на других языках и улучшить его.
364 1246971
>>246930

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

Алсо, я не уверен, что правильно тебя понял, но ты ведь понимаешь, что жс и перл - это не особо функциональные языки, потому что в них нет человеческой модели состояния? Типы данных там по умолчанию изменяемые, поэтому ты программируешь с байтами и структурами вместо списков и мапов.
367 1247232
>>247065
традиции-двача.пнг
368 1248306
>>077271 (OP)
Кто там про трансдьюсеры спрашивал?

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

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

>Сейчас что то нет сил разбираться


¯\_(ツ)_/¯

>С примерами на хачкеле


Выше вкидывали же.
371 1248569
>>077271 (OP)
Почему в шапке нет Душкина, я не понял?
image.png17 Кб, 299x168
372 1248998
поясните как по тру функциональщине работать с датой
373 1249048
>>248998
Нельзя интересоваться временем.
374 1249075
>>248998
Now и then предавай в параметры
375 1249121
>>248998
В монаде IO. Чистый код работает вне времени.
376 1249182
>>249075
покажи на пальцах антош плз

>>249121
еще лучше лол
377 1249309
>>249182

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


Ну а хули ты хотел? Вся грязь в IO:
https://ideone.com/3tfO2m
378 1250466
>>109457
Ни в одном более-менее сложном языке нет. Хаскель тут мало чем отличается от тех же крестов, например.
379 1250500
>>109457

> foo(a)


> догадайся, сколько функция займёт, без её определения


>>250466

> крестов


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

>Я не знаю Хаскелль ваш пока что, но разве он не продолжает многие идеи Лиспа и его Лисп-машин?


Я сам мимокрокодил, но хаскель вроде как идейный потомок ML-семейства, это немного другая ветвь эволюции языков.
381 1250737
>>250500

>А рантайм С


Это то еще неизвестное говно при включенных оптимизациях.
382 1250754
>>250737
Ну да, по сути вся скорость работы сводится не к естественности и нативности языка для машины, а к миллионам человеко-часов пыхтения над компилятором.
383 1250755
>>250754

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

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

>чтобы кеш дышал


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

Array of bulk objects -> Singleton of collections of primitive types + Proxy objects
388 1250864
>>250791
Не понимаю, о чём он, но, короче, данные грузятся в кеш целыми линиями, т.е. тебе надо сделать так, чтобы загружались сразу только нужные, и как можно меньше ненужных, чтобы не лазить в ОЗУ лишний раз, и чтобы кеш всегда был актуален. В линию, погружаются, очевидно, подряд идущие данные. Так что массивы тоже могут приемлемы при соблюдённых правилах.
В контексте многопокпока об этом написано у Энтони Уильямс в "Практике разработки многопоточных программ". Но там речь о перебрасывании кеша в основном.
Но суть будет доведена.
389 1250956
>>250864
что такое линия?
391 1251465
>>250754
Так и должно быть. Один раз написать хороший оптимизирующий компилятор полезнее, чем каждый раз писать оптимизированную под одну архитектуру программу.
392 1251594

>2018


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



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

> JS


А туда ли ты зашёл, петушок?
cthuko-shirobako-05v2-720p-h264-aac80c9b09b-mkvsnapshot05-5[...].jpg139 Кб, 1280x720
394 1251617
>>251615
Во-первых, это всего лишь иллюстрация, и я слегка удивлен, что ты ее не понял.
Во-вторых, лучше быть жс-петушком, чем токсичным мудаком.
395 1251620
>>251594

> ошибки в коментах


Вот это дебил.
Никто так не делает, кроме ЖСтуна.
Это только ЖС-дебилам так можно, а так - проваливай.
396 1251624
>>251594
В имаксе есть, емнип.
Без названия (1).jpeg19 Кб, 277x182
397 1251627
>>251617

> 2k18


> зашёл на двач


> ноет про токсичность

Yano.Erika.full.1843479.jpg757 Кб, 1160x1000
398 1251628
>>251620

>implying что это настоящие комменты


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

>проваливай


Нет ты! Токсичные педики должны уйти.

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

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

> это просто визуализация


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

>Имакс всем хорош, кроме кривой обучения.


Согласен. Спейсмакс помогает, но не до конца.

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


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

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

>>251620
>>251634
Съеби обратно в ньюфаг-тред, пожалуйста.
401 1251718
>>251594
VS Code + Haskell Language Server
1234.jpg93 Кб, 604x557
402 1253997
>>077271 (OP)
Добватье в шапку эту годноту:
https://www.ohaskell.guide/
403 1254147
>>253997
Ого, действительно годнота!
404 1254703
Поясните, что хорошо пишется (а лучше уже написано) на Хаскелле? Имеет ли какое-то практический смысл изучать этот язык, кроме гимнастики мозга?
405 1254794
>>254703
HTTP очень хорошо пишется, если использовать Servant.
406 1254937
>>254703
pandoc, например - швейцарский нож для текстовых форматов
или shellcheck, например
это из того, чем повседневно пользуюсь
407 1254947
>>254937
pandoc действительно убергодная штука

>>254703
тащем-то еще оконный менеджер на сабже есть, xmonad
короче, что угодно нормально пишется (кроме хард риалтайма всякого)
408 1254952
>>254947
Двачую xmonad, довольно долго им пользовался, но переехал году в 13 на awesome а потом на i3wm из-за того, что у него интеграция с панелькой была какая-то невразумительная. Есть кто-нибудь, кто его юзает? Как там сейчас, polybar смогу прикрутить?
Понимаю, что это не /s/, но у вас один хрен тред полумёртвый
409 1254961
>>254952
ein OS
ein Desktop
ein GNOME

Tod für unterperdolikmenschen!
410 1255014
Как в Хаскеле реализуются хэш-таблицы, всякие disjoint set и сортировки? Ведь менять значения нельзя, а для этих алгоритмов это критически важно.
411 1255040
>>255014

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


Меняют значения.
412 1255230
>>254952
Юзаю xmonad + xmobar, все устраивает.
413 1255357
>>249309

>резал из олфейс дифферент


анон там же по-русски блять написано, ну ты чиво нахуй!?
414 1255405
>>255014
Через деревья. Это не ты в соседнем треде то же самое эн дней назад спрашивал?
415 1255810
>>255405

> Через деревья


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

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

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


Чем у чего? Чем у хэша?

>Так что это не замена.


А мужики-то и не знали...

>Насколько я понял


Нихуя ты не понял, тебе все ссылки еще в том треде вкинули. Меньше выебывайся и больше читай.
417 1256464
>>256041

> Чем у чего? Чем у хэша?


Чем у дерева, очевидно. У хэша в среднем 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 и пр), да и не выглядит сильно удобным.
418 1256577
>>256464

>Чем у дерева, очевидно.


У хэшмапа сложность лучше, чем у хэшмапа, я тебя услышал. Я нихуя не понимаю, что ты имеешь в виду и о какой сложности ты говоришь. Доступ у хэшмапов на деревьях - log_a n для большого a, effective constant time который.

>во многих случаях честная хэш-таблица будет быстрее.


Ну так и код на си во многих случаях будет быстрее кода на питоне. Это же не повод говорить, что пайтон - не замена си для написания сайтиков, например. Узкое место у тебя будет, только если ты заполняешь за один раз огромный хэш с нуля, но ровно для таких случаев и существуют транзиенты. Как впихнуть транзиенты в чистый язык - это уже другой вопросhttps://github.com/ekmett/transients

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


Ну ладно, извини тогда, анон.

>только не бейте ногами


Лол, да я как бы тоже не хаскеллист, бггг.

>но он, насколько я понял, не может в декларации


Хм, нет, я погуглил и получается, что он все-таки может в прагмы.

>да и не выглядит сильно удобным.


Ящитаю в негомоиконном (тем более статически-типизированном) языке удобных макросов в принципе быть не может.
419 1256592
>>256464
Виталя, неужели ты на двощах сидишь?
420 1256596
>>256577

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


Он будет быстрее только в рамках Tilde Notation, Big Oh таким же будет.
421 1256665
>>256596
При чем тут биг оу, если речь о скорости? Скорость != сложность.
422 1256679
>>256665

>Скорость != сложность.


А если программа под большой нагрузкой работает? Или производит сложные вычисления?
423 1256684
>>256679
То скорость все еще != вычислительная сложность, очевидно, так как это по определению понятия разных категорий. Я не улавливаю, о чем вообще разговор сейчас идет?
424 1256690
>>256684

>скорость все еще != вычислительная сложность


Но ведь вычислительная сложность напрямую определяет скорость. Ты какой-то сектант, вбил себе в бестолковку, что хэш-таблицы и деревья это одно и тоже и прикидываешься тут дурачком.
425 1256708
>>256690

>Но ведь вычислительная сложность напрямую определяет скорость.


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

>что хэш-таблицы и деревья это одно и тоже


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

Вместо того, чтобы кидаться пустыми оскорблениями, разберись с понятиями, которые используешь. Это как минимум интереснее, согласись.
426 1256717
>>256708

>когда алгоритм с лучшей сложностью дает худшую скорость


Там либо константы при N большие, либо объем данных небольшой, но тогда про асимптоты речи не должно идти.

>могут быть реализованы с помощью деревьев


А я и не спорил, что не могут. Только как O(1) получить?
427 1256718
>>256708

>разберись с понятиями, которые используешь


А ты оставь этот менторский тон.
428 1256744
>>256717

>Только как O(1) получить?


Я уже писал по этому поводу в >>256577-посте под спойлером. Ъ-O(1) не будет впрочем, его и для мутабельных хэшмапов тоже не будет, строго говоря, будет логарифм_32 или что-то в таком роде, что называется amortized\effective constant time - то есть на реальных данных, которые в хэшмапу могут поместиться, она ведет себя почти как O(1), но на самом деле там просто очень пологий рост.

Ъ-O(1) на самом деле не Ъ, а такой же, как у мутабельных хэшмапов можно получить через линейные типы а-ля Раст, когда ты на самом деле свою хэшмапу ебешь и в хвост и в гриву меняешь, но компилятор может доказать, что эти изменения никогда не видны извне имплементации, а потому эффективно она является иммутабельной. Но так ты теряешь персистентность и к тому же это никому ненужно, так как на практике разницы между 1 и лог32 нет.

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

>>256718
Да без проблем. Но с понятиями все равно разберись :P
429 1256764
>>256744

>Ъ-O(1) не будет


Ну почему же, если хеш нормально считается, то коллизий не будет, либо их количество будет минимальным. Можно двойное хеширование использовать, тогда коллизий практически не будет. Плюс, если известен объем данных, то можно создать хеш-таблицу сразу нужного размера.
К тому же, у деревьев есть еще пара проблем: больше потребление памяти и промахи в кэше процессора.
430 1256766
>>256744

>на практике разницы между 1 и лог32 нет


Я бы не сказал, в критичных по скорости участках она вполне может быть. Но для 99% приложений да, скорее похуй.
431 1256767
>>256744

>лог32


Откуда взялось 32?
photo2018-08-2513-21-07.jpg22 Кб, 362x480
432 1257076
>>254703
Cardano, например.

>>255230
Двачую этого, xmobar нормально работает, бывали конечно косяки в некоторых релизах, но сейчас все норм. Так же могу порекомендовать dzen2 в качестве альтернативы.
>>254952
433 1257243
>>256764

>Ну почему же


Ну потому что все известные мне реализации хэшмапов подразумевают возможность коллизий. Если это считать "Ъ-O(1)", то и у дерева такой же "Ъ-O(1)".

>больше потребление памяти


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

>промахи в кэше процессора.


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

>>256766
Да, согласен. Под "на практике" я это и имел в виду.

>>256767
Ну там же не бинарные, а очень широкие деревья используются, 32-арные например.
434 1257367
Сап, Хаскелланы. Посоветуйте во что можно поконтрибьютить на хабе/лабе, во что бы вы сами, но времени нет?
Спасибо
436 1258052
>>257367
в GHC
437 1258065
>>077271 (OP)
Добавьте уже в шапку конфу треда, там все два с половиной анона сидят @hcdev
sage 438 1258356
>>258065
Петушиный загон же здесь: https://2ch.hk/pr/res/1249820.html (М)
439 1259725
Что-то меня всякие стаковерфловы только больше запутали с Текстом.
Это все-таки зашугаренное пердоленье с обычными Чарами?
Или как оно работает на низком уровне?
Объясните, плизки
440 1260985
>>077289
Вкатился в тред и сразу наткнулся на

> https://github.com/jystic/hadoop-tools/tree/master/hadoop-tools


Почему там один файл на 500 строк кода? В хаскеле нельзя модульно все делать? Тогда я выкатываюсь.
441 1261007
>>260985
В глаза ебешься?
442 1262087
Котаны, хотим на работе хаскель заюзать (вместо раста/котлина) для бизнес-логики. Что скажете?
443 1262105
>>262087
На расте-то безопаснее будет, тем более если вы его уже.
444 1262107
>>262105
Чем это раст безопаснее хаскеля?

В расте не устраивает вот что:
1, Ебать как долго компилится
2. Молодая экосистема, некоторых либ либо вообще нет, либо они кривые и хуевые
3. В тех либах что есть, видно что протекает раби-сознание авторов это я про актикс, когда выполнение зависит от какого-то глобального состояния, и валится с паникой в рантайме.

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

Мне в целом раст нравится, а за хачкель топит коллега-наркоман.
445 1262113
>>262107
Окамл лучше наверни, хороший компромисс.
446 1262114
>>262113
Так чем хаскель-то плох? Или чем лучше окамл?
447 1262121
>>262114
Да ничем он не плох, окамл проще гораздо, вкатиться можно быстрее.
448 1262127
>>262121
У нас есть гуру хаскеля, я сам более менее знаю. Так что это не проблема вкатывания.
449 1262140
>>262107

>Про котлин вообще говорить нечего, это просто ебаное легаси от которого потихоньку избавляемся.


Я аж смуззи поперхнулся от этого.
Стек меняете каждые три месяца?
450 1262278
Минутка юмора. Ребзя, каждый раз когда ебашите монады в хачкеле, на скалке, ну или на худой конец пишите в монадном стиле на linq, знайте, вы... "ОЛИМПИАДНИКИ". Посидел в пораше немного, узнал о том, что монадо-подобный дрист на сисярпе https://blogs.msdn.microsoft.com/lukeh/2007/08/19/monadic-parser-combinators-using-c-3-0/ это "олимпиадный код".

Узнал всё от "node.js"-бога. Такие дела.
Есть вообще кто-то тупее js-макак в принципе?
451 1262336
>>262278
пхп-макаки?
452 1262383
>>262087
Офигеть, где-то хаскель собираются использовать в промышленном коде. А что за компания или хотя бы область деятельности, если боишься дианона? Не боитесь, что потом нового хаскелиста будете три года искать когда ваш гуру из запоя не вернётся?

Я без наезда, просто вот этот аргумент (сложный найм)обычно первым приводят когда предлагаешь редкий язык.
453 1262388
>>262383
Стартап в финансовом секторе. Более того, у нас тут страна с населением в 5 миллионов человек. Так что скорее всего хаскель тут знает как раз наш наркоман и еще 2 человека.
454 1262487
Привет хаскеллисты! Думаю вкатиться, скажите честно: в чём вы видите недостатки/недоработки Хаскелля?
455 1262503
>>262487
Главный недостаток — ты охуеешь вкатываться.
456 1262604
>>262107

>Чем это раст безопаснее хаскеля?


От ленивости пиздюлей не огребешь. Понятней, предсказуемей. Ну ебли побольше, да.

Три пункта жизненные, тут спору нет.

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

>>262388

>Стартап в финансовом секторе.


Бля, ну тогда сам бох велел х-ль брать! или окамл

>>262383
Да ну на удаленку-то не проблема будет голодного сиэс-мейджора найти
457 1262605
>>262503

>Главный недостаток — ты

458 1262790
>>262383

>Офигеть, где-то хаскель собираются использовать в промышленном коде


https://github.com/erkmos/haskell-companies

>>262604

>От ленивости пиздюлей не огребешь.


сказки о проблемах с ленивостью расказывают довны ничего на хаскеле не написавшие

>можно в мутабельность без ебли с манатками


как что-то хорошее

>можно компилять в жс


как и хаскель

>>262605
this
461 1262836
В чем сложность хаскелля? Всего то матан знать.
462 1262902
>>262836
В хачкеле нет "матана", наркоман.
463 1262955
>>262790

>Сказки о проблемах с указателями в С рассказывают довны, если ты выстрелил себе в колено -- то проблема в тебе, а не в дробовике

464 1262962
>>262955

>Сказки о проблемах с указателями в С рассказывают довны, если ты выстрелил себе в колено -- то проблема в тебе, а не в дробовике



Именно так, дебич.

Наличие windows и linux (написаны на C) и отсутствие других операционных систем, которые не ноунейм (написанных на бизопасной абстрактопитушне) - этот факт подтверждает.
465 1262979
>>262962
Проблема не в написании ОС, а в том что никто под твою ос не будет переписывать софт. А если ты эмулируешь линакс, то нахуй ты нужен?
изображение.png72 Кб, 722x423
466 1262995
>>262979
>>262962

Пацаны, хотите поржать?

https://github.com/achilleasa/gopher-os

> How does it look?

467 1262998
>>262995
Над чем ржать то?
468 1263001
>>262998

>Над чем ржать то?



>go


>кококобизопасно сборщик мусора


>скриншоты как наша кококобизопасная OS выглядит


>kernel panic : system halted

469 1263010
>>263001
ОС со сборщиком мусора? Смишно.
Но судя по остальным скринам оно паникует вполне логично, потому что init обосрался по причине отсутствия оного.
470 1263205
>>262790

>сказки о проблемах с ленивостью расказывают


Тебе уже ответили, поддвачну того анона.

>как что-то хорошее


Да.

>как и хаскель


Разве там есть что-то живое? ghcjs, или про что ты?

>this


Спасибо.
471 1263390
>>262902
Даже так. Хаскелль не сложнее паскаля.
472 1263395
>>262487
ПОСТАВИЛ -1 ВМЕСТО (-1)
@
В ФУНКЦИЮ ПЕРЕДАНО НА ОДИН ПАРАМЕТР МЕНЬШЕ
@
ОХУЕВАЕШЬ ОТ НЕЧИТАЕМЫХ ОШИБОК
@
КОММЕНТИШЬ ПО ОДНОЙ ФУНКЦИИ, ЧТОБЫ ЛОКАЛИЗИРОВАТЬ ОШИБКУ
473 1263428
>>263390
В хачкеле для написания кода тебе надо искать экстремумы, локальные минимум и максимумы, доказывать теоремы, брать производные и интегралы, находить пределы функций? Что ты несёшь блядь. Есть подоплёка аппликативов, монад, функторов теории категорий к математическим моделям, только тебе для дрочбы в хачкеел со всем этим не надо об этом задумываться.
474 1263598
>>263395
Да ну, маняфантазии какие-то.
475 1263644
>>263598
трустори, вчера делал задачу из курса на степике и минут 5 охуевал с простейшей ошибки. Сообщения от компилятора еще хуже, чем от матерого шаблонного кода в C++. В хаскелле даже имена функций не пишутся. Иди ебись, сравнивая типы, что называется. Очень удобнонет
476 1263674
>>263644

>вчера делал задачу из курса на степике


Ну скинь код с ошибкой и сообщение тогда, чтобы не быть голословным, давай всем тредом попробуем угадать.
477 1263777
Хочу по вечерам вкатиться в хаскель. Книжки почитать, порешать задачки, может пописать учебные приложеньки.

Что надо устанавливать, какую IDE-шку использовать? На оф сайте какие-то 3 разных варианта установки, в вики ещё пять. Что наиболее православно? У меня мак.

По книжкам вроде вот эту рекомендуют?
https://www.amazon.com/Haskell-School-Expression-Functional-Programming/dp/0521644089
479 1263806
>>263782

> emacs + intero


братишка спасибо за совет, я не сомневаюсь в чистоте намерений, но боюсь emacs слишком хардкорно для меня :3
Что-нибудь бы типа vsсode или на худой конец от JetBrains..

Книжку заценю, спасибо.
haskell.png58 Кб, 1214x368
480 1263811
>>263674
Например. Делается каррирование и из функции с одним параметром вычитается 1. Как это можно понять из сообщения от компилятора?

Алсо буду признателен, если кто-то объяснит этот мунспик: a :: forall a. (Num (a -> a), Num a) => a -> a
481 1263812
>>263806

>но боюсь emacs слишком хардкорно для меня :3


Spacemacs попробуй, это вариация емакса для домохозяек с vi-шными кейбиндингами. dw знаешь? ну вот оно
482 1263823
>>263806
Да пиши для начала в любой онлайн идешке. Потом просто поставь ghc любым способом, ghci в терминале запусти. Потом уже со stack разберешься. Но спейсмакс двачну.
483 1263830
>>263811

>a :: forall a. (Num (a -> a), Num a) => a -> a


Это еще что, ты попробуй test -1 2 3 запустить.

А все почему? Безблагодатность обколются своим синтаксическим сахаром и ябут друг друга в парсеры. Нет бы как диды завещали делать, родина дала им sexpr'ы - нет, не хочу, хочу в парсеры ебаться и отлавливать баги с -1 и (-1). Зато статическая типизация. Мудачье, блядь, пидоры. И это программисты? Синтаксиса нацепили, говно жрут - пидоры, блядь, ебаные...
484 1263831
Кстати, сравните с православным верблюдом:

# test 1 2 -1;;
Error: This expression has type int -> int
but an expression was expected of type int

но по большому счету тоже говно безблагодатное, конечно
485 1263834
И с богоугодной Схемой, разумеется:

> (define (test a b c) (+ a b c))


> (test 1 2 -1)


2

Слышишь, как ангелы тихонько поют, когда ты читаешь этот код?
486 1263842
>>263834
На скале напишешь?
scalatest.png10 Кб, 476x213
487 1264235
>>263842
Миио проходил, на скале первый раз пишу, что тут за срач у вас?
488 1264391
>>264235

>срач


Я выдвинул тезис, что диагностические сообщения ghc - говно, а все согласились.
489 1264752
>>264391
Говорят, Олег умеет выводить constraint'ы type checker'а в уме.
490 1271212
Господа, а кто из вас пишет на хаскелле на работе? Какие отрасли? Сколько человек в команде? Насколько сложно найти новых сотрудников?

Как дела вообще с трудоустройством, полный пиздец? Что по деньгам?
491 1271589
>>271212

>2ch.hk


>пишет на хаскелле на работе


А ты оптимист.
492 1271651
>>271589
так 2ch.hk — это же halls of elita

Но вообще, если серьёзно, а хули нет. Вполне возможно, что все 2 российских хаскеллиста тут сидят.
493 1272059
>>271651
Да не. Иди в жж к мише хаскеллистов ловить.
494 1275996
Только что начал учить хаскель и дошел до списков. Вот уж не знал, что строго типизированные списки можно называть гомогенными. Как элегантно звучит! Я теперь их всегда буду так называть и тешить своё чсв. Спасибо, хаскель.
495 1276018
>>275996
О, заодно вспомнил, ещё один элегантный, бесподобный термин, когда ботал химию. Внимание, маэстро в треде! Как вам такое -- "Гетерогенный список содержащий гомогенные списки разной структуры". Красиво? Вот это да, меня самого распирает от своей мудрости. Вот это я илитарий, БЛЯ. Прямо чувствую себя нитакимкаквсе долбаёбом
Я конечно уже понял, что в хаскеле лист гомогенный и он не может быть гетерогенным(так ведь?) но слушайте, это же охуенно звучит.
496 1276019
>>276018
Гетерогенный список - это рекорд.

мимоумудренный старец
497 1276020
>>276019
Прости меня грешного
498 1276115
>>276019
Ну во. Дошёл до кортежей. Они как раз не гомогенные, а гетерогенные. То что я и хотел получить от списка есть в кортежах.
Кстати, вот что-то на тему гетерогенных списков, но я даже не разбирался, что там да как.
https://wiki.haskell.org/Fully-functional_heterogeneous_lists
499 1276159
>>276115
Рекорды и кортежи едины в своей сути. Следуй свету знаний, но не дай бесам сбить тебя с истинного пути.

мимоумудренный старец
500 1276165
>>276159
Почему ты список называешь "рекордами"? Я что-то не понимаю или это опечатка? Они похожи(как и все структуры данных), но у них есть несколько фундаментальных различий.
Я не дам бесам сбить меня с истинного пути, это же обычная любознательность.
501 1276199
>>276159
Ааа... лол, я всё понял. Я двусмысленно понял слово "рекорд". Погуглил - теперь всё понял. Извиняюсь за такой глупый вопрос тогда.
502 1277513
>>264752
Говорят, когда компилятор GHC запускают с параметром UndecidableInstances, он спрашивает ответ лично у Олега, поэтому и работает.
504 1278769
Читаю про эти ваши lazy-evaluations и прочие блага чистых вычислений, поделитесь опытом, насколько потом стабильна и предсказуема скорость исполнения и что у Хаскеля с профилированием?
505 1280822
>>278769

>поделитесь опытом, насколько потом стабильна и предсказуема скорость исполнения


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

>что у Хаскеля с профилированием?


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

Ты, блядь, как студент, который hello world написал. Типа "возьму я Си, там же я всё контролирую, я напишу самую быструю программу, а все остальные соснут!" Но нет, нихуя, сложность программы константна, и если ты возьмёшь lazy язык, или eager язык, ты одинаково заебёшься, просто в разных местах. И HPC на Хаскелле - это такое же байтоёбство, как на Cи. Хочешь выжимать максимум из программы, будь добр понимать, как работает компилятор и процессор, и руками под них всё оптимизировать. Это работает и для Хаскеля и для Джавы и для С++ абсолютно одинаково, и между eager и lazy нет особой разницы.
506 1280889
>>280822
Ты вы целом адекватен, братишка. Поэтому я поясню, что я как раз не студент и вполне себе занимаюсь байтоёбством и оптимизацией ебучих микросекунд. Читаю сейчас про Хаскель для саморазвития, и вот как-то возник выше обозначенный вопрос, сам понимаешь что если С относительно прозрачно разворачивается в Асм, плюс минус вполне описанные и предсказуемые оптимизации, то рантайм Хаскеля со стороны (я нуб в этой конкретной теме) выглядит как черный ящик с ебучей магией внутри.
Потому и любопытно, насколько это ящик бел, чист и ясен для тех, кто в теме
507 1280917
>>277788
Это Ева Грин?
508 1281160
>>280889
можешь пердолить байты вручную сколько хочешь http://hackage.haskell.org/package/ghc-prim-0.5.3/docs/GHC-Prim.html
509 1281278
>>280889

> то рантайм Хаскеля со стороны (я нуб в этой конкретной теме) выглядит как черный ящик с ебучей магией внутри.


LLVM для хачкеля давно написан
510 1283581
>>276019
Вот нахуй я сюда зашёл? Ты мне настроение испортил.
511 1287145
Какие вообще задачи у Хаскеля? Если я хочу йоба паралельный многопоточный проект то разумнее взять Эрланг. Если просто нужен функциональный язык то есть широкий ассортимент лиспов. Если нужен перформанс то Раст.
512 1287352
>>287145

>Если просто нужен функциональный язык то есть широкий ассортимент лиспов


Типы, братан. Хаскель умеет генерировать бесплатные термы из нихуя, тем самым обеспечивая корректность по построению и сильные гарантии на стадии конпеляции без особых усилий (со стороны разработчика, использующего подходящие библиотеки). На хаскеле стоит писать если ты готов лишний раз поебаться с типами, чтобы потом не ебаться со всем остальным.
513 1287468
Братишки, а что вы последнего написали на Хаскеле кроме очередной библиотеки для Хаскеля?
514 1287534
515 1287699
>>287468

>на Хаскеле кроме очередной библиотеки для Хаскеля


Это ещё зачем?
516 1287867
>>287352
А чем это все лучше обычного языка со строгой статической типизацией?
517 1287907
>>287867
Еще больше строгой статической типизации
518 1287963
>>287867
Во-первых, тем, что система типов гораздо более выразительная, причём настолько, что дальше идут разве что зависимые типы. Из всех production-ready языков у хаскеля типы наиболее понтовые.
Во-вторых, вообще, редкий язык предоставляет такие возможности для автоматической генерации кода. Это что-то на уровне лисповых макросов, только половину работы компилятор делает самостоятельно, глядя на типы.
519 1292042
>>287352
Все разговоры о корректности в контексте хаскеллевской системы типов могут заставить человека думать о какой-то магии, которая сама умеет отлавливать ошибки в программах. Это не верно, Хаскель никак не страхует от ошибок в алгоритмах. На самом деле Хаскель не про корректность, а про декомпозицию программ. Библиотеки для Хаскеля - это конструкторы, из которых можно собирать что угодно. А "сильные гарантии" - это гарантии того, что ты правильно комбинируешь детальки этих конструкторов. Лисп - это тоже конструктор. Но Хаскель - это LEGO, который не позволит тебе соединить детальки неправильно. А Лисп - это The Incredible Machine, в котором результат ты узнаешь только после того, как нажмёшь на кнопку Play.
520 1292044
>>287145

>разумнее взять Эрланг


С хуёв ли разумнее? В Эрланге только довольно убогая модель акторов, в Хаскеле куда больше возможностей для построения различных примитивов синхронизации, в том числе поддерживающих автоматическую композицию.
521 1292104
>>292042
Всё так, гарантии обеспечиваются системой типов. Но тип - это частичная спецификация, и иногда из одного только типа можно сгенерировать подходящий терм, корректный по построению. Вполне себе магия тащемта.
522 1292668
>>292104
магия - это то, что ты не понимаешь
523 1292797
Помогите, плизки, найти ошибку
рекурсия ++ рекурсия - работает
http://tpcg.io/TT6zaU
(рекурсия : рекурсия) : [] - не работает
http://tpcg.io/UGqpCH
Что я делаю не так?
524 1293403
>>292797
Конструктор (:) принимает голову списка и хвост списка. Оператор (++) принимает два списка.
525 1293709
>>293403
Спасибо копетан
526 1293750
>>293709
Пожалуйста, обращайся.
Тред утонул или удален.
Это копия, сохраненная 12 ноября 2018 года.

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

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски