>>875645 Да ладно тебе, здесь же по идее обсуждают особенности функциАнальной парадигмы. Существуют различные функциональны языки для веба(elm, purescript). не вижу ничего плохого в обсуждении clojure и здесь. более того, можно обсуждать фп фичи в мейнстримных языках(c#, js..). нутыпонял
>>875645 Еще к бамплимиту прошлого треда определились же, что самые обсуждаемые языки в треде - хаскель и кложурь. Кложурь настолько же лисп, насколько и то, что обычно называют "фп". А без эм-эля фп-тред пилить... как-то совсем странно. Так что все норм. К тому же тут общие вопросы можно обсуждать, а в треде про хачкель это бы странно смотрелось. Короче - все ок.
>>875653 >определились >самые обсуждаемые языки в треде >кложурь Сам же зафорсил в прошлом треде, сам же определился и сам же перекатил. Браво! 10 хитрых планов из 10.
>>875755 Ненужно. Вся суть котлина - это нескучные обои. Вообще, не рекомендую обращать внимания на языки, за которыми не стоит академического рисёрча или крупной корпорации.
>>875637 (OP) Аноны, подскажите что - нибудь почитать про фп. Не про синтакс отдельного языка, а чтобы вообще в целом и желательно на английском языке.
>>875776 >2016 >Хаскель IRL никому не нужен >Используя машины времени перенесемся на 20 лет вперед и увидим, что функциональное программирование победило! >2036 >Человечество уничтожено роботами >Их ИИ написан на Javascript >FUUUUUUUUUUUUUU
>>875645 У верблюда больше применений в реальном мире, чем у хаскелля, с чего это он вдруг стал не нужен? Благодаря фейсбуку скоро и фронтендеры на окамледиалект переходить начнут.
>>875885 Какой такой талмуд? В том же TaPL на весь нетипизированный лямбда калкулус страниц 20 наверное отводится. Лямбда — это буква. Если тебе интересно, что такое лямбда-терм — так и спрашивай. Но в этом случае я отправлю тебя читать TaPL
>>876021 Дебил, наше комьюнити перевело несколько самых мастрид книг по цс. Никто не заставляет тебя читать их на русском - просто это отличный список чтения.
Алсо, детектирую в тебе школьника, русофоба и латентного ватника.
>>876167 А интерес теоретический (узнать, откуда все берется и как оно работает) или практический (начать писать более лучший код)?
Мне кажется, тебе больше подойдет или sicp, или htdp. Но второй совсем для начинающих, тебе будет скучно, наверное. Так что да, наверное лучше sicp. Писать можешь в plt racket, он сразу идет с простенькой, но удобной ide, зиро конфигурейшен.
>>876238 У тебя есть гарантии, что хотя бы один фп язык станет мейнстримным? 10 лет назад никто не вспоминал про ФП, потом функциональные фичи начали добавлять в популярные языки. Нет уверенности, что нынешний интерес не угаснет. Я начал изучать ФП с хаскелля и тебе советую, в любом случае потом будет легче выучить любой функциональный язык. Если тебя интересуют карьерные возможности, то лучше либо закрыть этот тред, либо учить скалу, хоть это и мультипарадигменный язык и он тебе не даст той базы фп, которую мог бы дать хаск.
>>876238 > что будет популярным и востребованным Тогда что ты здесь делаешь? Хаскель никогда не будет популярным и востребованным. Если ты действительно хочешь "популярный и востребованный" язык, то тебе в питон/пхп/жс/жаба-тред
>>876258 >учить скалу Языки смысла нет "учить". Синтаксис отдельного языка при некотором опыте осваивается быстро. По хорошему учат сами модели в общем и как оно работает. Но раз на Хаскеле легко понять всю функциональную кухню, то возьмусь за него.
>>876238 неверно. ФП вообще сейчас в принципе не очень востребован, понимать его есть смысл лишь для "изменения чего-то в мозгу", чтобы применять это в других языках (тот же redux в жсе). Тут можно и сразу хаскель, ибо с ним это "изменение" произойдет максимально быстро. А после уже пиши на любом языке, каком хочешь.
>>875880 фронтендер на clojure, заинтересовал синтаксис этого reason. Но по нем очень мало инфы. Меня, например, интересует интероп с js-ом. Есть какая информация? Или он еще WIP (коммиты не самые активные)?
>>876258 Я бы советовал скалу тем кто уже работает с джавой (именно работает, а не просто знает). Изучать по отличной книге https://www.manning.com/books/functional-programming-in-scala. Не уверен что у неё есть аналог для хаскеля. Из-за FPiS я даже иногда думаю что скала может быть первым ФЯП, но на работе убеждаюсь в обратном.
Аононы, такой вопросик. Допустим надо разбить стрку произвольной длины на список строк фиксированной длины. Решение в лоб, которое я вижу - рекурсивно перебирать элементы строки и инкрементировать счетчик, счетчик достиг порога - добавляем строку в список, не достиг - делаем конкатинацию. Но как мне кажется решение по производительности не не очень оптимальное. Вот объясните, как можно решить задачу боле оптимальным способом, и какой у вас ход мыслей был при поиске решения. Хотелось бы в целом понять, разницу в мышлении функциональщика и императивщика. Я вот будучи закостенелым императивщиком привел решение скорее таки в императивном стиле.
>>876675 > Лол, честно не видел. это я к тому, что мое решение дублировало то, что выше) Но решение выше моего скрина не совсем верное из-за ++ вместо : > Ок, спасибо. Я вот стал смотреть функции для работы со списками, а почему вы решили использовать take\drop, а не splitAt, например? splitAt использовать конечно лучше. Другое дело, что take/drop - частоиспользуемые функции в разных ФЯП, а вот про splitAt я как не хаскельщик вообще не знал
Подскажите еще пожалуйста, мы же можем >chunks n list = chunk:chunks n rest >where chunk = take n list >rest = drop n list заменить на >chunks n = chunk:chunks n rest >where chunk = take n >rest = drop n и соответсвенно на >chunks n = chunk:chunks n rest >where (chunk, rest) = splitAt n
>>876770 нет > where chunk = take n означает, что в chunk - функция [a] -> [a]. И вот ты склеиваешь эту функцию с (chunks n rest), где ты передаешь в chunks другую функцию [a] -> [a] (из rest). Возможно, такое можно как-то сделать через композицию, но имхо все усугубляет читаемость кода
Еще такой вопросик. Я применяю функцию к аргументу типа с достаточно большим количеством именованных полей. Вот собственно как мне добраться до значения каждого поля? Типо только так? myf (MyType {field1 = f1, field2 = f2}) = MyType {field1 = f1 + f2, field2 = f2 + f1} Тогда получится, я больше развертку field1 = f1, field2 = f2, ... буду описывать, чем логику самой фукнции. Есть способ как-то это дело сократить?
>>877522 Ну, я чуток стесняюсь да и мои идеи бредовые, я хорошо стукнулся головой.
Я думаю, что связи между нейронами в мозгу можно представить как грибницу. https://core.ac.uk/download/pdf/6117416.pdf здесь есть математическая модель развития мицелия. В купе с импульсными нейронными сетями это должно что-то дать по моему. Грибница разума.
Но основное внимание я бы уделил языку. Когнитивная лингвистика, общая семантика. Шизофреники довольно часто любят создавать новые слова, которые кажутся бредовыми. Но есть такие языки, где надо создавать новые слова, такие явления, в частности называются инкорпорацией, агглютинацией и полисинтеизмом. Есть, например, язык Арахау. Или более известный, но тяжелый язык Ифкуиль. Кстати, язык Арахау построенный по архаической, то есть древней системе языков, фактически на чем-то вроде праязыка, есть такая гипотеза. И там, представьте себе, plus означает минус. Но не наоборот. Значит кто-то за всю историю поменял значение. Еще можете посмотреть расшифровки имен http://rbardalzo.weebly.com/names.html
У аутистов есть некая привязанность к объектам. То есть, тебе говорят что-то вроде кактуса, а тебя самого даже чуть покалывает. Но это подобно чуть к синестезии. Кстати, есть такая фоносемантика, так она изучает само звуковое строение слова и то как оно влияет на восприятие человека. Я даже часто замечаю на себе, что часто излишне импульсивен и сужу по информации по проигрыванию в себе некой пластинки с ней и таким образом строя несложную ментальную модель, то есть, в том смысле, почему люди дали именно такое название тем или иным событиям, явлениям, предметам. К слову, довольно таки неплохо получается.В этом ключе мне нравится некая комбинация фоносемантики и теории очевидностей https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%94%D0%B5%D0%BC%D0%BF%D1%81%D1%82%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%A8%D0%B0%D1%84%D0%B5%D1%80%D0%B0
Еще как-то полезно бы где-то найти различные ментальные модели в различных ситуациях. Что-то вроде, ты знаешь, что такое биологическая эволюция, значит можешь и представить себе, что такое эволюция звезды.
Про зеркальные нейроны я сейчас изучаю. Но первое, что пришло в голову это посмотреть конструкцию термоядерной бомбы и как там зеркало помогает фокусировать. Ну, и совсем очевидные, хоть и вряд-ли правильные это зеркала для комнаты смеха, механизм проецирования. А дальше уже строить линзы, очевидно же. Хотя это просто, скорее, принцип фонаря или как там, то есть куда проще, туда и идти. Была вроде доля шутки, где алкоголик не хотел искать кольцо, там где не было фонаря, ибо там темно. Да-да, очень смешно, ага-ага.
Кстати, на днях пришла мысль о распознавании изображений. Применять туда фрактальное сжатие. Патенты на алгоритмы уже истекли. А ранги фрактального сжатия довольно неплохо по мне подходят для многослойного распознавания.
Впрочем, я довольно таки недавно ударился головой, да и я теоретик-хеллоувордщик, так, что пожалуйста не бейте сильно. Даже может бы книжку какую-то умную дали. Большинство людей говорит, что то, что я пишу это шизофазия.
>>877557 >Даже может бы книжку какую-то умную дали. В ОП-посте в принципе список книг есть, можешь начать с "Learn You a Haskell for Great Good". Очень неплохая книга для новичка.
>>877557 >Я думаю, что связи между нейронами в мозгу можно представить как грибницу. https://core.ac.uk/download/pdf/6117416.pdf здесь есть математическая модель развития мицелия. В купе с импульсными нейронными сетями это должно что-то дать по моему. Грибница разума.
У грибов нет подразделения клеток на рецепторные или мышечные и т.д. Математическая модель роста гриба обеспечивает ему лишь равномерное распространение тела в гумусе, для лучшего поиска питательного вещества. Это мог бы быть и фрактал, если бы шанс нахождения питательных вещест был больше.
На самом деле можно было бы построить нейронную модель ленточного червя, ибо они пиздец какие протые и пиздец как хорошо изучены и пытаться модернизировать как-то.
>Про зеркальные нейроны я сейчас изучаю. Но первое, что пришло в голову это посмотреть конструкцию термоядерной бомбы и как там зеркало помогает фокусировать. Ну, и совсем очевидные, хоть и вряд-ли правильные это зеркала для комнаты смеха, механизм проецирования.
У меня бэкграунд джавовский, сейчас полгода пишу на скале и пытаюсь перестроить голову на фп. И вот я не понимаю, как классическую схему с контроллерами, сервисами и репозиториями перенести на фп. Предположим у нас есть контроллер, который вызывает сервис, который делает какую-то логику, сохраняет сущность в репозиторий, генерирует ивент, отсылает письмо на почту. Т.е. делает три сайдэффекта. Сайдэффектами мы с помощью монад управляем. Ок, но у меня монады же разные. Типа DbMonad, EmailMonad, еще какая-нибудь монада. Видел варианты решения с трансформированием монад, вариант возвращать функцию, а не монаду и где-то на самом верху эту функцию вызывать. Но если у меня монады не могут трансформироваться одна в другую? В скале в принципе все к фьючур трансформировать можно так или иначе, но если я не хочу фьючур. Или, если лямбды возвращать, то в итоге нехуевый такой граф зависимостей для лямбды наверху может получиться, что не есть гуд. В ооп все просто было - заинжектил зависимость и хуяришь, а тут пока все способы не выглядят многообещающе. Есть что почитать, посмотреть на эту тему?
>>877748 У тебя как-то все смешано. В spray/akka-http, например, тебе нужно построить роут, передавая свои функции в функции routing-dsl'я. Тут все функционально, причем не важно что эти функции делают на самом деле. Я не уверен что ты правильно понимаешь что такое трансформирование монад. Это не преобразование одной монады в другую, а их композиция. В результате такой себе стек монад получется. Future действительно неудачное представления сайд-эффектов, используй scalaz.Task если можешь. Инжекшн зависимостей вообще не имеет отношения к тому о чем ты говорил, делай его через конструктор (возможно через имплисит параметры), и всего делов. >Есть что почитать, посмотреть на эту тему? Вот немного: про трансформеры: https://www.youtube.com/watch?v=hGMndafDcc8 про архитектуру: http://degoes.net/articles/modern-fp-part-2 про работу с бд: https://www.youtube.com/watch?v=7xSfLPD6tiQ Последнее видео вообще хорошо показывает чем хорошо ФП.
Есть два типа заявок - Active и Backup. Есть очередь, в которую можно закидывать заявки в произвольном порядке, но извелкать из очереди нужно либо заявки типа Active, в той последовательности, в которой они приходили, либо заявки Backup, в той последовательности, в которой они приходили, либо независимо от типа заявки, но опять же в той последовательности, в которй они приходили. Делаю типо очередь элементов, каждый из которых содержит очередь заявок типа Active и следующий элемент, который содержит очередь заявок типа Backup и следующий элемент, который содержит и т.д. При добавлении допустим заявки типа Active - "проваливаемся" в самый последний элемент с заявками типа Active и добавляем заявку в очередь. При извлечении допустим заявки типа Backup - "проваливаемся" в первый элемент с заявками типа Backup и извлекаем заявку из очереди. Получается как-то так, ("проваливаемся" в последний элемент с заданным типом заявок): data RequetsType = Active | Backup data QQueue a = Nil | QQueue RequetsType [a] (QQueue a)
qlast :: RequetsType -> QQueue a -> QQueue a qlast Active z@(QQueue Active q Nil) = z qlast Backup z@(QQueue Backup q Nil) = z qlast Active z@(QQueue Active q (QQueue Backup q1 Nil)) = z qlast Backup z@(QQueue Backup q (QQueue Active q1 Nil)) = z qlast Active (QQueue _ _ qq) = qlast Active qq qlast Backup (QQueue _ _ qq) = qlast Backup qq
Я совсем наркоман или норм? Может конечно есть готовые контейнеры под задачу, но вот так навскидку не нашел.
Блядь, зачем фейсбук пилит reason? Я только-только освоился с пюрэхаскеллями, до меня наконец-то дошла прелесть контроля эффектов — но из-за появления reason я не знаю, куда прикладывать усилия. С одной стороны, сложная йоба, которая компилируется только в ЖС. Но с сайд-эффектами, нормальной do-нотацией и в более-менее стабильном состоянии. С другой стороны более простая йоба, которая компилируется в ЖС и ОКамл, к тому же развивается книгой. Но еще WIP, без чистоты, с прилепленной сбоку пародией на do-нотацию. И как там дела с квикчеком/генеративными тестами?
Я в лимбе, блядь. Тру-ФП уже готово для веба, но пока не ясно, какое из них брать.
>>877950 Учитывая, что лицорукакнига набрала команду компилер-девелоперов (которые и пилят всю эту йобу) только из-за того, что не хотела уволнять пхп-девелоперов, логично предположить, что ризон она пилит по той же причине. Короче, я бы подождал пару лет минимум.
Алсо, как у него с интеропом?
Через десять лет слова "мл-лайк лангуаж" будут вызывать те же чувства, что сейчас вызывают "си-лайк лангуаж".
>>877988 >только из-за того, что не хотела уволнять пхп-девелоперов В этом есть что-то плохое? Девелоперов сохранили, да и сам пхп стал лучше, чем 5 лет назад в том числе благодаря книге — сплошной шин же.
>Алсо, как у него с интеропом? На одном уровне с пюрэ. Разве что с документацией BuckleScript придется чуть-чуть ознакомиться. >external now : unit => int = "Date.now" [@@bs.val]; И кроме всего прочего, в ризон уже реализовали JSX. Если бы JSX и встроенные опциональные аргументы был в пюрэ — я бы даже не задумывался о выборе языка, а то читать списки списков как-то все не привыкну.
>>877988 >Алсо, как у него с интеропом? Оно компилируется в обжектив верблюда, у которого есть компиляторы в жс, жяву, натив и собственный байткод. Нутыпонел. >мл-лайк лангуаж А что не так-то? Прекрасный синтаксис. Хочешь фичастости — всякие GADT и модули пофичастее чем в хаскеле, хочешь быстрый код — пиши циклы с указателями.
>>877995 > шин же Шин-то может и шин, но от компании, которая переписывает компилятор языка из-за того, что у них сайт на этом языке тормозит, можно ожидать чего угодно. Сегодня пилят, завтра не пилят. Ненадежно.
>>877997 Вейт, вот? Даже так? В жс через окамл? По-моему это все игрушки и ненужно короче, с ффи заебетесь.
Я не про синтаксис, а про то, что сейчас ПАТТЕРНЬ МЯЧИНГ и ТИИИПЫЫЫЫ - это модно, и языки штампуются (и будут штамповаться) бездумно и безыдейно, а через десять лет всю эту кучу говна придется разгребать. В этом смысле хачкель ничем не лучше крестов или джавы.
>>878016 >Сегодня пилят, завтра не пилят. Ненадежно. Да похуй абсолютно, лол. Во-первых — там весь проект состоит из замены кейвордов и различных скобочек с символами на окамловские. Даже если что-то поломается - проект небольшой, исправить не сложно. Во-вторых — у тебя конечно сплошной фейсбук, который однажды переписав на новый модный и красивый язык/фреймворк - и все, пиздец. >с ффи заебетесь Ну всякие скалажс и кложаскрипты живут же. >это модно, и языки штампуются (и будут штамповаться) бездумно и безыдейно До этого было то же самое — все копаются в жяве и крестах и живы, здоровы хотя про здоровье не факт, лол. >хачкель ничем не лучше крестов или джавы По такой логике вообще все языки говно и нахуй вообще жить - через десяток лет устареем и станем легаси на свалке исторри.
>>877689 Так и цифровые нейросети рецепторы воспринимают дискретно, проходя через АЦП. К слову, мицелий все-равно может чувствовать боль, в том смысле, что реагировать. То есть, восстанавливаться после некоторых разрушений, хоть и не как нервная сеть и не всегда. Впрочем, думаю, что добавить некоторые чувствительные конечности в цифровом виде было бы не слишком сложно. А затем модулировать и передавать по нитям. Впрочем, вряд-ли я сказал что-то нормальное. А мышечные, тут надо подумать. Судя по всему для мицелия нужны некоторые санитары, прочищать забитые пути, старые стереотипные... Нет, усложнение. Я пытаюсь достичь в этом плане некоя вибрация нитей, мозги кипят, путь на стороне листа понятен. >Математическая модель роста гриба обеспечивает ему лишь равномерное распространение тела в гумусе, для лучшего поиска питательного вещества. Это мог бы быть и фрактал, если бы шанс нахождения питательных вещест был больше. А разве нейроны в человеческом мозгу не есть на некой нейроглии, которая и питает ее? Взять вместо нейроглии некий гумус. Или это совсем бред, как и все остальное? Фракталы вроде бы даже и не есть каким-то противоречием, скорее всего http://studopedia.org/4-153326.html Впрочем, думаю, что фрактал нужно представлять и мыслить фракталами уже уровне чуть выше за этот. Но не слишком и высоко, конечно. К примеру, как некая мозаика даже. То есть, если отдельно нейрон может распознавать символ, то кому это интересно? Но если сам по себе нейрон ничто, но собираясь в группы, но самостоятельно, а не жестко. Я уже писал о фрактальном сжатии изображений. Да сети Кохоненна, но все-же это не то, что требуется.
Я, кстати, сейчас пытаюсь изучать формирование нервной системы в состоянии эмбриона и кажется, что это опять подходит под грибы. Но в этом случае под грибок. Такие пузыри на грыбке. Интересно, есть ли математическая модель развития грибка на различных животных. Кстати, посмотри вот http://elibrary.ru/item.asp?id=22134417 На основании полученных результатов, установлена биологическая ценность активных пептидов гидролизатов коллагена чешуи и.рациональность их сочетания с пчелиной пыльцой. Предложен состав гейнера для спортивного питания, обоснованы рекомендации по его применению. Забавно, не так ли? При чем тут спортивное питание? Ну, чуть синкретизации и ты войдешь в мой ход мыслей. Но и я хотел бы почерпнуть твои ментальные модели. Например, как ты в голове держишь последовательность целых чисел, десятичных и так далее. Используешь ли ты мнемотехники и так далее. Мне плохо в этом понимании. Я целый день хожу как овощ, думал, что ответить тебе, но сейчас мне ударил мощный импульс и мысли, ассоциации довольно странные, остальное, хлынуло-подпрыгнуло в голову. Вспоминается тот странный парень по имени, что-ли, Иешуа из Кин-дза-дза.
Расскажи, пожалуйста, о ленточных червях. Очень интересно, как я понимаю это не те ребята, то есть, грибы что ими занимаются проектом OpenWorm? У них вроде червь нематода. В чем преимущество ленточных червей в этом плане перед червяком нематоды?
Да, с зеркалами вообще тупо. Собственно, может даже скорей и именно линзы. Но отражатели, сразу вспоминаешь Алису в стране чудес. Такой себе, тоже процесс мыслей можно проследить и своебразная странная эмпатия нового уровня. Тут может даже нужны и зеркальные пазлы с 4D-печатью и даже больше измерений, лол. Шучу. Но зеркальные нейроны довольно хорошая вещь.
Я вообще не понимаю, что со мной делается. Мышление стало каким-то импульсивным и очень переносится на бессознательное. Я могу слушать незнакомый текст на не знакомом языке по незнакомой теме и включая у себя пластинку начинать его и ее понимать. Такая фоносемантика, теория очевидностей, как я уже говорил. Я думаю, что ИИ, как уже говорил, должен применять во многом бессознательное, как сознательное. То есть даже применять когнитивные искажения. Я довольно много манипулировал людьми и осознал, что во многом они даже сказанную мною мысль нечайно как-бы поза кадром будут воспринимать, как свою собственную. Не говоря уже об ожидаемости, но меня много иллюзии забавляют или мучают. Некая вешалка, сапог, одежда кажется сидящим человеком. Могу увидеть в скрепках и бумаге довольно детальную куклу. Еще постоянно эти оклики. Странные штуки. Боюсь сойти с ума, может я уже пишу бред, но врачи мне говорили, что я просто невротик. Не знаю зачем я это написал, может хотел высмеятся.
>>878049 Забыл дописать, что дабы сойти с ума нужен ум. Да и самоорганизация невозможна без энтропии. Тут сразу вспоминается химический катализ и его связь с информатикой, то есть такая научная работа была на Киберленинке. Довольно таки популярное решение где-то в 60-х годах, но теперь нет. Да и пролог уже не очень используют.
В детстве какие-то странные информационные потоки вливались в меня. Я даже активно видел Дом 2 на украинском. В мой код, я начинаю замечать, записано выражение мамы о том, что надо сделать ритуал, если ты сказал что-то вроде "черт побери". Дабы черти покинули хату. А еще Кин-дза-дза, я помню с детства лишь тот кадр, где ведут парня в желтых штанах, которого я воспринял за Иисуса. Я смотрел сериал Универ и шоу долгоносиков. Первый я смотрел под влиянием своей двоюродной сестры, я делал на телефоне нокия сайт из таких рамок, разных линий _. Сайт для универа, папиных дочек да разные там эти, мне наверное нравилась сама картинка происходящего. А телепузиков я всегда боялся. Черный бумер, скрытые сигналы детей, которые хотят попробовать коноплю, но не знают про опиодные рецепторы и не могут ее достать. И когда я перевелся, почему? Я сам странно вел... девочка повела меня за какие-то кирпичи и захотела поцеловаться. Это было в первом классе, я ничего не понимал. Меня спрашивали кем я буду, каким военным, сказали сказать моряком. Учительница сказала мне так ответить, а потом это распостраняли. Но я не хотел быть военным. На детских фотографиях я был безчувственным и излишне над людьми, но когда я был возле растений я чувствовал себя радостным. Но возле дома напротив дедушки и бабушки росли грибы, я считал их вредными и уничтожил. Я даже уничтожил мицелий. Они больше не росли. Я уничтожал грибы, что росли на деревьях вверху такие большие, я не знаю деревья, их названий. Но зачем откопали елочку возле моего дома мама и отдала ее посадить возле церкви? Ее никто не подливал и она засохла. Она верила, что быть слишком выше дома это плохо.
>>878023 > Да похуй Ну блин, там кто-то выше по треду кричал аллилуйя, мол труфп ин да браузер - а на деле это какой-то ненужный кусок говна уровня детского конструктора.
Твое "во-вторых" я вообще не понял, у тебя там предложение не согласовано - хуй знает, что ты сказать хотел, вот често, извини.
Скалажс не живет. В кложурскрипте нет ффи, там изначально язык дизайнился с прицелом на симлесс интероп с хост-платформой.
> До этого было то же самое Тхиз, я как раз об этом.
> все языки говно и нахуй вообще жить Ветс ма бой!
На самом деле все языки хороши, пока занимают ту нишу, для которой они предназначались.
>>878016 >переписывает компилятор языка из-за того, что у них сайт на этом языке тормозит Ризон они пилят, потому что синтаксис им не нравится. То ли жабаскриптеры неосиливают писать -> вместо =>, то ли хрен его знает. Вот в этом случае лучше бы они действительно компилятор окамла переписали. Со всем тулингом. И библиотеками.
>>878242 > Ризон они пилят, потому что синтаксис им не нравится Вообще не понимаю этой хуйни. В эмелях же самых хуёвый синтаксис эвар, что-то типа паскаля, только всерьёз. Вот бля, я и джаваскриптовый синтаксис люблю, и хаскельный, и скальный (пока не начинается scalaz), но эмельный это же очевидная говнина говнин, просто ёбаный уродливый мусор, как его можно любить за что-либо? Он хуёвый, с какой стороны ни посмотри, что для писания, что для читания.
>>878264 Если ты про смлный, то я с тобой согласен, хотя там всё не так плохо, как ты рисуешь. В окамле же всё заебись с синтаксисом. Разве что begin и end можно было заменить на фигурные скобочки, потому что писать лень, смотрится так себе, а обычные скобки хрен увидишь. Тут дело в том, что они в итоге сделали ещё хуже, чем было.
>>878267 Бля, я в глаза проебался. В ризоне заебись синтаксис, это в окамле говно. Единственное что неоч - это лямбды: js: let f = x => y => x + y reason: let f = fun x => fun y => x + y
>>878397 В эмелях нельзя сделать where, потому что порядок вычисления императивный. Некоторые учоные это считали настолько важным что даже писали про это статьи в духе "The next 700 programming languages": http://www.inf.ed.ac.uk/teaching/courses/epl/Landin66.pdf
>>878401 >В эмелях нельзя сделать where Да как нефиг делать. Просто трансформируй в let первым проходом по аст. А если так хочется ленивости (или будут проблемы с перекрёстными дефинишонами), то всегда можно обернуть в функцию.
>>878404 Здесь слово "императивный" лучше подходит. Суть в том, что стейтменты вычисляются друг за дружкой и биндинги - не исключения. Введение связывания/переменной - это стейтмент, который должен участвовать в этой императивной очереди выполнения строчек и должен предшествовать строчкам где это связывание будет использоваться. Эмели со своими let-ами здесь ничем не отличаются от сишек или джаваскриптов.
>>878408 Ты просто задумайся о схеме такого преобразования. Например, f x = if x > 10 then y else z where y = longComputation1 z = longComputation2 Будут ли леты перед if, или внутри then-else? А это только самый банальный пример, даже без сайдэффектов.
>>878410 Куда-то не туда тебя несёт, по-моему. В том же хаскиле ты не можешь вычислить a + b не вычислив полностью всё, от чего зависят a и b. И вычисляться они будут ровно так же по очереди как и в мле. >>878412 >Ты просто задумайся о схеме такого преобразования. Задумался, всё нормально. >Будут ли леты перед if, или внутри then-else? А это не важно. Во-первых, можно объявить where синтаксическим сахаром для let, а там пусть сами ебутся. Во-вторых, можно во время компиляции обернуть их в лямбду без (ок, с одним) аргументов и получить ту же самую семантику. Преобразование тривиальное, даже пандорический захват не надо делать.
>>878417 > можно во время компиляции обернуть их в лямбду без (ок, с одним) аргументов и получить ту же самую семантику. Какую ту же самую, ты ебанутый? Если ты обернёшь их в санки, не мемоизирующие результат, ты получишь call-by-name если ты обернёшь их в санки, мемоизируищие результат, ты получишь call-by-need, как в хаскеле, только неоптимизированный. Вот так вот вводя "незначительный сахарок" ты незаметно сделал язык ленивым. >>878418 Ты отвечаешь на пост в котором ничего не говорится про хаскельный let. В эмелях другой let, в котором синтаксическая позиция и порядок вычислений неразрывно связаны.
>>878428 В широком смысле под биндингом понимают просто синтаксическое введение имени, независимо от того, во что оно там скомпилируется и как будет работать.
>>878431 Введение имени это определение лейбла указывающего на какие-то данные, а в хаскеле имя ни на что не указывает, это просто параметр выражения, оно не живёт само по себе, его нельзя отдельно определить.
>>878421 >ты незаметно сделал язык ленивым Не язык, а одно выражение. И не сделал, а это всего лишь один из вариантов решения. Так-то в окамле есть lazy, он теперь ленивым языком становится что ли?
>>878439 > нету where, какие-то ёбаные галочки в типах, одномерный синтаксис > есть where, двумерный, в синтаксисе нет вообще ничего похожего на эмельный > мл-лайк /0 >>878444 > where - сахарок > ту же самую > подразумевал не эмельную /0 >>878441 Введение имени это лирика, а не физика, аутист. >>878450 Ок, нормальное замечание.
>>878401 В том же пюрэ есть where. Ленивость, порядок вычислений — все это не имеет значения, когда речь идет о сахарке. Как сахарок нужен — тот и можно сделать через ppx.
>>878466 >Введение имени это лирика, а не физика, аутист. Не можешь отличить параметр выражения от лейбла? Совершенно разная семантика же. Можешь ты в хаскиле ввести имя отдельно от лямбды куда оно тут же будет подставлено? Не можешь. Ну значит это нихуя не введение имени.
>>878466 Ладно, ты не знаком с историей создания хаскеля, не понимаешь, что тебе пишут и пытаешься толстить. По-моему все в треде это уже поняли, хватит это кормить.
>>878049 >>878060 это писал один и тот же анон? если так то чувствую родную душу :3 скажи, анон, чем ты занимаешься в частности в треде по фп? не хочешь вместе поупарывать?
>>878794 >гарантировано не требует вычислений в рантайме Хуй пойми, что ты тут имел в виду. Вычисления во время компиляции? Отсутствие информации о типах в скомпилированной программе? Последнее называется type erasure, если что.
>>877950 >зачем фейсбук пилит reason? Хочет и пилит, в чем проблема? Он может это себе позволить. >Я только-только освоился с пюрэхаскеллями, до меня наконец-то дошла прелесть контроля эффектов — но из-за появления reason я не знаю, куда прикладывать усилия. ИМХО, ризон не дает ничего нового по сравнению ни с хаскелем, ни с пюрешкой, поэтому не нужен. Кроме того, сам по себе тезис "фейсбук разрабатывает ризон" совершенно не означает, что за этой командой стоит вся мощь фб. Это скорее инвестиции, как в случае с мозилловским растом. Выстрелит - окей, не выстрелит - тоже хуй с ним. А вот пюрешку клепают люди, у которых основной продукт на ней сделан. Причем в последнее время они зашевелились, фундепы добавили. Хаскель тут вообще немного в стороне - GHCJS завезли, хуле надо кроме того что когда в последний раз я на него смотрел, он был он тормознутый, жрал память как не в себя, да и хуй соберешь. А еще в итоге тащишь весь рантайм в браузер. Как там, кстати, не пофиксили его производительность?
>>879438 >Это скорее инвестиции, как в случае с мозилловским растом. Выстрелит - окей, не выстрелит - тоже хуй с ним. Лол, нормальную ты так хуйню написал. Начиная с того что они его вполне целенаправленно разрабатывают, заканчивая тем что он привносит дохуя нового в байтопердолинг — по всем своим же пунктам обосрался.
А вообще, я не понимаю что вы так прицепились к этому ризону — это даже не язык, а интерфейс к окамлу, как его называют сами разработчики. Хотели потыкать окамл но не нравились begin..end и звёздочки вместо скобочек с запятыми — ну потыкайте ризон, больше он не для чего не пригоден.
>>879470 >это даже не язык, а интерфейс к окамлу Так это же чудесно. Вместо очередного нового языка, который хуй знает когда созреет, получаем все плюшки уже имеющегося старичка. >что вы так прицепились к этому ризону Ризон — это окамль с вебмакаковским человеческим лицом. Оксиген никому не был нужен. А реакт нужен всем. И хороший язык для реакта дает надежду на увеличение продуктивности работы.
>>877783 Я бы не советовал использовать cake pattern, если ты совершенно четко не понимаешь какие плюсы и минусы он тебе даст по сравнению с конструкторами конкретно в твоём случае.
>>879507 > Ризон — это окамль с человеческим лицом. Оксиген никому не был нужен. А реакт нужен всем. И хороший язык для реакта дает надежду на увеличение продуктивности работы. Чёто я нихуя не улавливаю твоей логики. Реакт - жс фреймворк написанный на жс, причём тут окамл?
>>879524 Ты не в курсе, что ризон нацелен именно на жс-макак, и одним из его плюсов числится легкость взаимодействия с жс и генерация жс-кода, похожего на написанный вручную? Один из фейсбукокорейцев уже почти допилил типизированные биндинги ризона к реакту, в дискорде можешь все увидеть.
>>879536 Бредятина какая-то. Скажи честно, ты видел тайпскрипт? Он от этого вашего ризона отличается вещами уровня "x => x + x" vs "fun x => x + x", причём не в пользу ризона. И для него тайпинги для всех сортов реактов и ридуксов уже давно написаны.
>>879557 Ага, видел. И отсутствие non-nullable типов до второй версии видел. И отсутствие ADT вижу. И косяк с инвариантами вижу. Тайпскрипт — это жаба, натянутая на ЖС, а не полноценная система типов. Флоу и тот лучше.
>>879564 >А потом прочитай все разделы раньше и покажи в ризоне юнион типы и типы пересечения. Ты хоть страничку ризона открывал? Или код на кемле хоть раз видел? А вообще тот анон прав — тайпскрипт это какая-то ява с мл-ем.
>>879564 >function isFish(pet: Fish | Bird): pet is Fish { > return (<Fish>pet).swim !== undefined; >} АХ ТЫ Ж ЕБАНЫЙ ТЫ НАХУЙ. ADT my ass. Химера из жабы, утки и верблюда. Мутабельная химера. Недоделанная химера. Не, лучше не посылай меня в документацию, а изучи ризон и/или окамль.
>>879570 Ты же даже не знаешь, что такое типы объединения и типы пересечения. Я не буду копипастить тебе код со ссылки, не можешь открыть - твои проблемы. > изучи ризон и/или окамль. Я дрочил на модулефункторы ещё когда твой папаша ебал свою правую вместо твоей мамы, сейчас когда мне нужен параметризуемый модуль я просто пишу "module.exports = (param) => { ... }" и живу полноценной жизнью.
>>879595 Это не костыли, а остриё прогресса в мирке типизации. Я просто расширил круг претензий ещё и до модулей. Где-то там в 70х в языкострое было модно выдумывать синтетические абстракции и усиленно воевать с простотой и законами физики. Ни в коем случае нельзя реюзнуть обычные типы для модулей и делать параметризуемые модули обычными функциями, надо непременно придумать какие-нибудь сигнатуры, функторы, ебливую модель компиляции, чтоб пользователь языка не заскучал.
>>879434 Ну, ты знаешь, что такое зависимые типы? Рантайм от компайлтайма отличаешь? В общем случае они требуют контроля типов в рантайме. Вот я и спрашиваю, как называется их подмножество, которое ничего не будет делать в рантайме.
Единственное чем привлекает этот ризон - возможностью писать компактные нативные программки на языке менее блевотном, чем все остальные с аналогичными свойствами.
>>879623 > как называется их подмножество, которое ничего не будет делать в рантайме. Гугли "proof irrelevance". >>879628 > Завтипы, как и прочие типы статически-типизированных ЯП, проверяются в компайлтайме. Проверяется структура с точностью до индукции всякой, сами значения в типах в рантайме нужны, причём иногда даже для логики. Например, это совершенно нормально для языка с завтипами, распечатать размер, который хранится на тайплевеле, для списка, длина и содержимое которого определяется в рантайме.
>>879630 Нет, на джаве или сишарпе или питоне или жс нельзя писать компактные нативные программки. Они все требуют рантайм, они все исполняются на VM. А ризон в этом плане как сишка или кресты: делаешь маленькие скоростные екзешники которым ничо не надо.
Посоны, можно как-нибудь дать синоним дата-конструктору? data Some = Foo String | One И нужно что-то вроде Synonim :: String -> Some Synonim str = Foo str
Сап функциональщики Подскажите пожалуйста что обмазать чтобы понять зависимые типы. type-driven development with idris кто-нибудь читал? Стоит ее покупать? Я знаю эрланг, кложу и хаскел и хочу понять в чем прикол зависимых типов, посмотрел пару видосов на ютубе про идрис от создателя идриса, выглядит круто. Но чувак просто показал как он делает что-то на идрисе, выглядит как черная магия. Может есть хорошие пейперы или книги где это все описано?
>>880676 >type-driven development with idris кто-нибудь читал? Она ещё не вышла. на сайте издателя значится как early access автор ещё не дописал её, значит но первые главы прочитать уже можно, если предзаказать печатную версию на сайте
Хаскеляне, у меня допустим тип данных с большим количеством полей, а логику надо реализовать в зависимости от значения только одного из этих полей. Как в этом случае добраться до его значения без дикого патерн матчинга в виде func _ _ _ _ myfield _ _ _
>>880665 >>880666 Почитай про PatternSynonyms. С ними можно сделать это как минимум для паттерн матчинга: pattern Yoba :: Some pattern Yoba <- Foo "Yoba" Но будет ли работать Yoba в обычном контексте вне матчинга - я хз, хаскеля под рукой нету, сам проверяй.
>>880836 Так зависимые типы это обязательно жосткая абстрактная теоретическая наркомания, приземлённого ремесленнического там в принципе быть не может, потому что нужно оно для супер-пупер формально-даказанных прошивок ядерных ракет.
>>880844 Подмножество зависимых типов, которые есть в скалке, эмелях и тайпскрипте - это обычно не то, что имеют в виду, когда просят накидать литературы по зависимым типам.
>>880848 Ну ладно, идрис себч позиционирует как "прикладной" язык, так что все равно необязательно ракеты. Алсо, что ты имел в виду под зависимыми типами в мл? В депендент мл или в мл?
>>880851 "Прикладной" язык Идрис - это как раз для ядерных ракет. А когда завтипочек говорит "неприкладной", он вообще имеет в виду использование для конструктивного доказательства математических теорем, а не для софта.
>>880833 Прост хотел чтобы у конструкторов и прочего были как нормальные имена, так и односимвольные из блока юникода Mathematical Alphanumeric Symbols Короч обычный Больше айдишники меняю и отступы выравниваю чем код пишу.
>>880851 > что ты имел в виду под зависимыми типами в мл? В депендент мл или в мл? То же что и в скале имеют в виду под зависимыми типами - path dependent types. Они есть хоть в смл, хоть в окамл. А в депендент мл что-то куда более существенное, ближе к агдам.
Посоны, есть какая-нибудь простая GUI-библиотека для Хаскелля под винду? Для тех кто ТОЛЬКО УЧИТЬСЯ. Мне прост юникодный текст нужно выводить, а у терминала с этим проблемы. Ну ещё хотелось бы пару блоков с выводом текста, пару кнопочек и одну стороку для инпута.
Начал вкатываться в хаскелл и застопорился на первой же задачке. Хочу для тренировки реализовать ориентированный граф и пару алгоритмов на нем, которые сейчас разрабатываю по работе на скале.
В общем я не осилил как реализовать граф. В джаве он выглядит как
class Edge { Node source; Node dest; double weight; // еще всякие специальные значения }
Так вот, как мне такую структуру перенести в этот ваш хаскелль с его прекрасными адт на которые так все яростно надрачивают? Как определить дерево рекурсивно я понимаю. Но как определить граф, который может содержать циклы? Ведь получается что мне в конструктор объекта нужно передавать объект который еще не создан.
Пока единственное что приходит в голову - хранить не ссылки на Node в ребрах, а какой-то индекс, а в самом графе хранить мапу из индекса в ноду. Но блядь, какого хуя? Лишнее преобразование, плюс потенциальное место для ошибок несуществующими индексами.
>>882503 Головка от хуя. >>882491 Щас бы о таком на ананасовой борде спрашивать. Еще вкшечку с авторизованным паспортом попроси сразу прикреплять к ответам.
>>882479 Почему тебе нужно именно такое представление? Задавай граф матрицей инцидентности, например. >>882518 Кто вам это в уши насрал? LIghtbend всю свою инфраструктуру строят на скале, просто начали уделять больше внимания джавистам. Хотя и раньше в джаве использовали play и акку.
>>882647 >Задавай граф матрицей инцидентности, например. У меня очень большие графы (миллионы узлов), притом довольно разряженные. Матрица при этом дохуя лишней памяти, она годится только для небольших плотных графов. Так что только списки ребер, только хардкор.
>>882536 Мда. Ну и нахуй ваш этот хачкель нужен, если я рпостейшую задачу из теории графов без ебли на нем решить не могу?
>>882732 Он для развлечения нужен, лол. Хочешь писать что-то кроме кластера метапарадигм и дрочива на типах — возьми что-то попрактичнее. Окамл, скала там. цл если ты скобкофил
>>882740 > возьми что-то попрактичнее. > Окамл, скала там. цл если ты скобкофил Из огня да в полымя. На окамле вообще писать нереально даже чисто из-за его синтаксиса, не говоря уже о мёртвой экосистеме, тулчейне который на винде настроить так же сложно как хаскель 10 лет назад. ЦЛ невменозный язык гениальных решений типа сadaddr и mapc. Scala - Java для шизофреников.
>>882745 Хз что там у окамла с экосистемой, иде нет как и на том же хаскелле — онли редакторы с утилитками автокомплита. С синтаксисом у него всё как раз таки заебись в хаскеле повырвиглазистей, хоть и компактнее, если ты сидишь на венде — ок, отпадает. Цл предложил "просто так", ради разнообразия лол. А вот что не так со скалой, при том что ты сам на яве пишешь — мне в голову совсем не приходит.
>>882740 Скалу я и так использую по работе. Понравилась функциональщина но раздражает слегка ее (скалы) переусложненность, в итоге решил попробовать вкатиться в чистый функциональный язык.
>>882751 Это не я отвечал. Я как раз сейчас перекатываюсь из джавы в скалу (пару проектов уже на ней сделал небольших), ну вот решил заодно хаскелль глянуть.
>>882803 >из-за ленивости Поясните, какой в ней практический профит? То есть да, в каждой статье про хаскелль будет обязательно написано про охуительные оптимизации, связанные с чистотой функций вообще и ленивостью в частности, в итоге из текста создается впечателение что ленивость охуенно позволяет выигрывать в производительности. Но при этом по результатам бенчмарков и тестов хаскелль нихуя не впереди планеты всей, по производительности он в целом уступает С++ и держится где-то на уровне джавы.
>>882845 Не знаю где это ты видел что ленивость = оптимизация (и как вообще ты связал это с чистотой), это чаще всего абсолютно наоборот например выделить большой кусок памяти под весь массив разом будет куда быстрее чем делать это при обращении к каждому последующему элементу.
Чистота вот уже может помочь оптимизации кода, но точно так же только в определённых юзкейсах а может так же всё здорово замедлить.
То что он держится на уровне жавы на практике ирл он заметно медленнее, а как-то выезжает только в синтетике, и то не везде, лол — это уже ахуенный результат, показывающий насколько хорошо порвботали разрботчики ghc. Просто это, видишь ли, это декларативный язык — он намного высокоуровенней жявы, и его скорость решается в первую очередь оптимизатором, а не тем насколько обосрался при написании.
>Ну и смысл в этом всем тогда? развлечение, считай это тестовым обкаточным полигоном для новых(зачастую старых) крутых концепций, которые рано или поздно окажутся во всех языках в той или иной мере, просто сейчас для них рановато — так же как симула в своё время, или Джобс со своими рассказами 2007-го года "как всё окажется в браузере".
>>875637 (OP) >Types and Programming Languages Эта книга не про практическое программирование, это по сути CS/математика с кивками в сторону имплементации компиляторов. Она точно нужна в этом списке?
>>882875 > (и как вообще ты связал это с чистотой) чистота как раз таки сильно влияет на ленивость. Именно благодаря чистоте хаскель знает, что при одном и том же аргументе будет то же самое значение, фаза луны и время никак не могут повлиять, а значит выполнение можно отложить
>>882912 >>882914 двачую, наряду с кложей второй фп-язык (хоть честно говоря эти потоки как-то не очень вписываются в концепцию "чистые функции"), который используется в реальном мире (особенно эликсир сейчас потиху заменят руби)
>>882845 Сделать ленивое энергичным можно довольно легко, поставив какую-нибудь языковую йобу. Но вот наоборот в энергичном языке уже сложно - нужно писать специальные ленивые версии всего, и как-то еще заморачиваться.
>>882940 >Сделать ленивое энергичным можно довольно легко Вообще-то, нет. "Поставив йобу" означает, что кто-то за тебя уже всё написал. А так тебе точно так же придётся переписывать всю библиотеку, которая была заточена под ленивость, и при энергичных вычислениях может просто зациклиться на самой невинной на первый взгляд функции. Да и если твой язык изначально ленивый, то энергичным его можно сделать, наверное, лишь поправив компилятор/интерпретатор, в энергичном же можно просто всё обернуть в функции (будет выглядеть как говно, но мы сейчас не об этом).
>>882518 >Тем что он сдох они переименовались и переключились Я не про тайпсейф, а про тайплевел: cats, shapeless, вот это вот все. Тут тебе и уже почти стандартная библиотека тайпклассов, и чисто функциональные структуры данных, и продукты с копродуктами.
>>882910 >Она точно нужна в этом списке? Да. То что сегодня подразумевают под "функциональным программированием" - это во многом именно "программирование на уровне типов".
>>882921 Подробнее: https://hackhands.com/modular-code-lazy-evaluation-haskell/ >>882845 Кроме модульности, еще можно делать цикличестие зависимости и мемоизацию в чистом языке. Выше в ссылки были. А о производительности по сравнению с другими языками особено никто не говорит: в них тоже можно использовать ленивые вычисления, чтобы не считать лишнего.
>>883018 Это лично тобой так воспринимается. Лямбда исчисление это функциональный язык и там типов нету. Я изучал долгие месяцы хаскел и зависимые типы, пытался присесть со штангой и сейчас решил что типизация и чистота мешают мне писать нормальный понятный код. На хаскеле что не пиши получается борьба с тайпчекером и какая-то ультразащитная хуйня. В общем если к коду нету офигенских требований по надежности я считаю сложную типизация оверинженерингом и через чур защитным стилем написания кода.
>>883018 В итоге в списке 2 книги про то как начать программировать прикольно с нуля и неведомая теоретическая йоба с миллионом математических теорем в качестве упражнений.
>>882479 Не знаю, как правильно решать такую задачу, самого напрягает невозможность нормально задать циклические связи, но все чаще меня посещает мысль, что явных циклических связей даже в мутабельном коде быть не должно. Если данных мало, то можно их описать как угодно, заботиться об эффективности и компактности незачем. Если данных действительно много или они используются в вебгуйне, то приходится думать о сетевом взаимодействии, где циклических ссылок нет(хмл-параша не в счет). Выходит, что в любом случае уместно городить типы, подобные реляционным отношениям в БД, а не обычные объекты.
Приведите хоть один пример реальной задачи, где без циклов не обойтись и\или они сделают код в стопицотраз практичнее и элегантнее. Вот и мне ничего в голову не приходит.
>>883601 >В русте вообще все с этим ок Может потому что он вместо фолдов просто инлайнит обыкновенный цикл? Ты глянь имплементацию-то.
Да и опять же: вложенность. Они хороши когда нужно что-то быстро перебрать за проход. Посмотри на benchmarksgame rust vs c и haskell vs ocaml - там где первые разгромно сливают на пустом месте всё внезапно забито мапами и фолдами.
>>883601 Бля, ну если у тебя. array_map( function($person) { return $person['name']; }, $some_array); Это пиздец зашквар. Foreach проще и читабельней в данном случае, и удобнее, можно юзать yeld.
>>883616 >Тем более все равно используются циклы Всё равно всё компилируется в машкод for simplicity умолчим про байткод, так давайте писать на голом машкоде.
Простое доказательство отсоса функциональных дебилов: Map: array_map( function($person) { return $person['name']; }, $some_array); Foreach: let r=[];for (let p of a) r.push(p.name); Практически в 2 раза меньше кода, и гораздо читабельней.
>>883650 >>Лямбда исчисление это функциональный язык и там типов нету >А как же типизированное лямбда-исчисление, м-м-м? это надстройка, хочешь типов? Пожалуйста, но в своем сообщении я сделал акцент на то, что основа функционального программирования не требует типов. Можно быть функциональным, чистым и имьютабельным не сражаясь с тайпчекером. Тайпчекер не обязателен.
>>883658 Ты дебил? Просто иди нахуй отсюда в свою пхп парашу. Фолд это оператор высшего порядка которые позволяют делать сложные преобразования данных в декларативном стиле, фолд изящно параллелится и математически прекрасен. Если ты не знаешь нахуя тебя хотя бы операторы высшего порядка (Даже джава долбоебы уже догадались, прикинь?) то что ты делаешь в этом треде?
>>883691 В какой теории? Ты лурка начитался? ДАЖЕ ДЖАВА слесари это делают на своем хедупе, а в функциональном языке ты просто спавнишь еще один поток потому что данные не зависят друг от друга, в эрланге реализация распределенного мап-редьюса занимает до 50 строк, зависит от раскидистости почерка. Хаскелистам даже делать нихуя не надо вроде, он будет фолдить асинхронно даже не явно для программиста.
>>883696 >данные не зависят друг от друга Только вот в случае фолда они зависят. > Хаскелистам даже делать нихуя не надо вроде > вроде Все твои "знания" — это набор слухов.
>>883713 >Ты писал параллельный код на хаскеле? Нет. Но необязательно писать параллельный код, чтоб знать, что хаскель ничего "автоматически" не делает и Amdahl's law с причинностью нарушать не позволяет.
>>883725 Ну и это довольно сильные ограничения на функцию, которую можно сунуть в fold. Надо, во-первых, ограничить тип операции с a -> b -> b до a -> a -> a
>>883728 >Ассоциативной тоже Что значит "тоже"? Ассоциативности достаточно, коммутативность не нужна.
Короче, коммутативность нам нужна для того, чтобы промежуточные результаты можно было продолжать редьюсить в порядке их получения, разве нет? Ассоциативность нам дает только отсутствие разницы между левой и правой сверткой, но чтобы продолжать свертку на каждом уровне, когда готовы хотя бы два любых результата на этом уровне, нам нужна коммутативность, верно?
Если нет коммутативности, то будут локи и не полная параллельность.
>>883739 А, ну если ты хочешь в порядке получения, то тогда да, коммутативность нужна.
>Ассоциативность нам дает только отсутствие разницы между левой и правой сверткой Даёт возможность параллелить вообще. Т.к. позволяет считать (x `f` (y `f` (z `f` (.....))) Как (x `f` y) `f` (z `f` w) `f` ....
>>883741 Я это и имел в виду, да. Короче, мы просто под "параллельностью" подразумевали разные вещи: я - полную, а ты - хоть какую-то\практическую. Вот.
>>883744 Разве? Левая свертка - это ((a.b).c), а правая - (a.(b.c)). Или наоборот, вечно путаю, лол. Порядок аргументов тот же, порядок вычисления только другой.
Но ведь все это по итогу сведется к тому что какие-то части параллелятся из-за отсутствия зависимости к следующим вычислениям а какие-то не параллелятся. Можно просто разделить эти задачи между потоками мапперами и потоками редьюсерами как это делают в эрланге например. Коммутативные функции про которые вы говорите выше ведь всеравно должны на каком-то этапе свернуться в 1 аккамулятор ведь. Правильно? Просто если операция коммутативна то можно ее сделать параллельно, но прицепить к результату свертки ее всеравно надо будет, или я что-то упускаю?
>>883750 Хер знает, для меня картина мира такая - мап можно распределить на хуилион потоков и потом свернуть результаты. Первая часть параллелится как нефиг, вторая под вопросом, свертка же тоже может быть простая например просто добавлять результат в set, что является ассоциативной и коммутативной операцией, тогда можно редьюсеров захуярить большое количество и это будет очень близко к тру параллельности. Но все должно будет сойтись когда-нибудь в 1 точку из-за чего эта параллельность не совсем чистая. Опровергните если я не правильно понял
>>883748 И что? Это же разные (в общем случае) элементы. Давай еще раз: левая свертка от правой отличается расстановкой скобок, но не порядком аргументов. Мы не делаем (c.b).a, мы делаем a.(b.c) - ок? Из ассоциативности для трех элементов прямо вытекает ассоциативность для эн элементов, а левый фолд от правого только ассоциотивностью и отличается.
>>883756 Ну ясное дело, что в итоге все сойдется в одну точку, но под параллельностью же мы понимаем разделение задачи на потоки там, где это возможно, да? То есть 2+2 - это частный случай параллельного вычисления: тут всего одна операция, так что ясное дело, что она выполняется атомарно (параллелить ее не с чем, она одна всего), но это как бы такой аналог базового кейса в рекурсивном определении. Короче, параллельность - это не значит, что мы в каждый момент времени нагружаем эн потоков, параллельность - это когда мы всю имеющуюся работу (относительно) равномерно распределяем по всем имеющимся потокам.
>>883750 Ну, мап - частный случай фолда, еали уж на то пошло, но я про мап-редьюс не рассказываю, если это ты на меня намекал.
>>883762 ну хуй знает дебильный термин применил. В общем в случае с мапом мы параллелим труево, потоки полностью параллельны и отобразить это можно как лист параллельными линиями мапится в другой лист. Рисунок параллельной свертки будет же выглядеть как полурешетка. Немного другая форма вычислений немного не такая, чем та, что ты видишь когда параллелишь маперы.
>>883769 Взял первый попавшийся пример из гугла. >>883774 >В общем в случае с мапом мы параллелим труево, потоки полностью параллельны и отобразить это можно как лист параллельными линиями мапится в другой лист. Как мне кажется это схема, которая лишь описывает ограничение политики распараллеливания, то есть мы фактически говорим "дождаться результата применения функций вот в этом и в этом потоке и применить функцию в отдельном потоке". И вообще что ты подразумеваешь под "тру параллелим" - два потока Хаскеля, два потока операционной системы, два потока операционной системы привязанные к разным CPU?
>>883789 Я имею в виду асинхронные процессы, как они реализованы мне вообще пофиг. у нас есть лист из 50 элементов мы делаем параллельный мап. Для этого спавнится 50 процессов внутри системы. Для программиста это выглядит так. В железе же у нас например только 1 алу и тогда планировщик распределяет нагрузку асинхронно. Если у нас 50 алу то они буду полностью параллельны. Ну в общем наверное надо от этого термина дурного тру-не тру отказываться, в целом я понял что фолд можно вполне эффективно распределить на много потоков если операции коммутативны, ассоциативны. Чуть менее эффективно чем мап.
Аноны, подскажите такую штуку. Есть класс с двумя функциями, назовем скажем Foo() и Bar() Функцию Foo() вызываю я сам, функцию Bar() вызывает другой элемент фреймворка, в неизвестный момент времени после вызова метода Foo(). Вопрос: Как мне, фп-way, передать некое значение из метода Bar() в точку вызова метода Foo()? Если кому-то интересно - язык C#, платформа Xamarin.Android
>>884027 >сайтец на С++ с вставками на асме Хуйня. Надо было делать свой православный бинарный формат заместо проклятого хтмл, а ты просто пыжылся сделать более лучшую раздавалку текста.
>>884271 Отделяй, но в этом конкретном случае фреймвор диктует тебе как писать код. Сложно писать функционально в неподходящем окружении. Это, к слову, не понимают дурачки которые кукарекают что скала с появлением восьмой джавы стала нинужна.
>>884520 > Локальное мутабельное состояние никак не противоречит никаким фп-уэй. Всем похуй, что там у тебя внутри одного класса происходит. Верняк, любую глобальную переменную можно считать просто слепком мира IO-монады, все процедуры просто описывают отображения мира но для краткости это опущено как в синтаксисе так и в сигнатурах, но это сахарок - всё чисто.
>>884541 Лол, ну так-то я не совсем это имел в виду. Я не про глобальные переменные, а про локальную мутабельность. Если чистая по сигнатуре функция создает внутри какое-то локальное мутабельное состояние, которое никак не ввходит наружу, то она все равно остается чистой для вызывающей стороны.
>>884560 > что там у тебя внутри одного класса происходит. Тогда лучше было написать "внутри функции", потому что мутабельные поля класса - то же самое что глобальные переменные.
>>884566 >поля класса - то же самое что глобальные переменные Зависит от интерфейса класса. Если их изменения видны снаружи, то да, ты прав. Если это какой-то кэш для мемоизации что-то не могу больше примеров придумать, разве что для самопальной реализации ленивости, то нет.
>>884463 Сложно, ну что мешает >>884520 локальные мутабельные переменные меняют состояние объекта класса >>884581 А они кстати в моем случае не подойдут?
Господа, а поясните-ка мне одну вещь. Я правильно понял, что в конструктивной математике (в контексте данного треда - в языках с зависимыми типами) теорема Ферма доказывается в одну строчку пикрелейтед и ее фальшивость подтверждается тем фактом, что соответствующий такой спецификации тип пустой? Как написать конкретный код (неважно на чем) для проверки?
>>886152 Там же написано, что можно написать спецификацию, не зная, существуют ли программы, ей удовлетворяющие. Пикрелейтед нет никакого доказательства, там только формулировка соответствующей теоремы (т.е. тип). Доказательством была бы программа.
>>886184 Ну смотри, в прувере пишется спецификация, и если нет программ, удовлетворяющих такой спецификации, то спецификация противоречивая и ей соответствует пустой тип. Это же и есть доказательство теоремы Ферма, т.е. ее абсурдности.
>>886191 Попытаться их построить конструктивно, т.е. начать перебирать указанные в спецификации a b c и n. Как только найдется n, нарушающий равенство в последних скобках, считай доказательство построили.
>>886205 Ты не понял жи. Согласно этой спецификации требуется найти 4 натуральных числа, удовлетворяющих условиям спецификации. Правильность теоремы Ферма зависит от того, есть ли такие числа для всех случаев. Любой набор положительных чисел, не соответствующих спецификации является доказательством ложности теоремы Ферма.
Собственно, задача - конкретный код >>886152 этого. Чтобы можно было тралить сторонников неконструктивной математики, которая еблась с теоремой Ферма 200+ лет, а в конструктивной все доказывается одной коммандой на функциональной ЯП.
>>886245 Не будет никакого траленга. Всё точно так же: достаточно найти один контрпример и тогда получится записать терм с таким типом -> теорема опровергнута.
>>886218 Зойчем ты перепечатал это еще раз, это же на том пике написано.
>>886207 То есть тот факт, что эта теорема истинна, тебя не смущает? Еще раз: доказать отсутствие перебором? Алсо, как из перебора натуральных чисел у тебя получается программа?
>>886387 Ты перебираешь на бумаге или ещё где, а когда найдёшь 4 подходящих числа, тогда можешь их вписать в код и они будут термом-доказательством вот этого типа: (exist a:N)(exist b:N)(exist c:N)(exist n:N) -> (n>2&a^n+b^n=c^n). Всё, больше никак. Если не найдёшь такие 4 числа - доказать этот тип не сможешь.
https://youtu.be/oyLBGkS5ICk > Right now, you press "save" in your editor and all your tests run, because your tests are pretty useless: you wrote them yourself and they don't test anything
Очередной охуенчик от Рича Хикки о композиции софта на макро уровне и о том, почему semantic versioning - хуйня. Первые несколько минут скучноваты, но дальше просто и сидишь и думаешь про себя: блядь, это же очевидно и просто, почему мы этого до сих пор делаем? Как мы вообще умудрились get it wrong?
Почему модули не знают ничего о неймспейсах? Почему неймспейсы не знают ничего о версиях? Почему версии не знают ничего о системе контроля версий - она же, блядь, для этого и предназначена! Просто пиздец какой-то, если задуматься: все в индустрии используют абсолютно сломанное решение, просто сломанное и нерабочее, просто из-за того, что в свое время никто не сел и не подумал, как сделать это правильно.
Да, как я из его слов понял, как это примерно может выглядеть. Вот пишешь либу, решаешь ее зарелизить. Делаешь неймспейс либраринейм.апи.в1. Помимо него у тебя есть еще и либраринейм.приватный-стафф. Делаешь джар\гем\крейт, модуль короче, в котором пишешь, что он провайдит либраринейм.апи.в1 (а про приватный-стафф ничего не пишешь). В следующем релизе решаешь добавить еще одну функцию в апи, например, - это все еще в1-компатибл апи. Еще через релиз понимаешь, что тебе надо переименовать (то есть убрать одну и добавить другую) функцию - создаешь либраринейм.апи.в2, экспортируешь туда весь в1 апи и делаешь замену, релизишь. Приватный-стафф остался тот же, реюзаешь. в1 апи остался тот же, ничего не ломаешь. В мавене теперь лежит два модуля: только с в1 и с двумя в1 и в2 апи, оба называются "либраринейм", второй расширяет первый, ничего не сломалось. Потом делаешь следующий релиз и все переписываешь с нуля, апи.в3. А первые два апи выкидываешь, чтобы не загромождать код. Тогда модуль будет называться уже, условно, "либраринейм-некст", потому что он ломает совместимость => другое имя. Еще по идее можно вытаскивать все эти в1 и в2 из гита, а не держать в стейджинге. И все эти переименования будут формально проверяться, то есть если попытаешься запушить под тем же именем модуль, из которого что-то выкинуто - компайлтайм эррор (точнее релиз-тайм), если код функции изменился по сравнению с прошлым коммитом - релизтайм ворнинг, тут уже придется повериьь на слово, что поведение не изменилось.
>>886387 >Еще раз: доказать отсутствие перебором? Либо присутствие. А как ты еще предлагаешь доказать что-то кроме собственно построения вычислимого объекта и его предъявления в качестве доказательства? >как из перебора натуральных чисел у тебя получается программа? Тут >>886407 за меня ответили. Пустой тип соответствеут абсурдности изначального высказывания, непустой - доказательству такового высказывания, это интерпретация логических констант по Гейтингу. Программа = функция в конструктивном смысле, т.к. принимает нечто на вход и выдает нечто на выходе. Пример - лямбда же, да и вообще все функциональное программирование. >>886696 Ты хоть название для начала писать научись, потом предъявляй что-то.
DI зависимости на грязные функции - как сделать?Аноним05/12/16 Пнд 12:03:11#360№888294
Пример У меня есть чистые функции func1 и func2 и "грязная" funcIO (она делает запрос к вебу) func1 вызывает func2, которая вызывает funcIO
Я хочу подменить funcIO на фейковую и протестить func1 Как это сделать?
=================================================
Сначало я передавал funcIO как параметр в func2, но из-за этого funcIO приходится передавать еще в func1. Минусы: параметры метода засоряются и много копипасты
Сейчас я храню такие "грязные" функции как бы в глобальном словаре и планирую в тестах заменять его элементы на фейковые. Минусы: появляется некая неявность в программе, те вызываю функцию и не знаю заранее, а вдруг где-то внизу есть запрос в сеть и тп.
>>888294 Передавать всем функциями словарь env с компонентами, которые делают всю грязную работу. Это устоявшаяся практика тащем-то. Алсо, если у тебя ф2 вызывает ио, а ф1 вызывает ф2, и ты хочешь тестировать ф1, то у тебя скорее всего неоптимальная архитектура. Надо стараться, чтобы в каждом модуле только функции верхнего уровня требовали енв, а вся логика была в чистых функциях, которые бы чейнились с грязными функциями линейно, а не вложенно. Не всегда так красиво получается сделать, конечно, ну и без контекста непонятно, что там у тебя с этим.
>>889080 Да ладно! Не, не верю, я ее видел до этого дохрена раз, и никакие детекторы трансов во мне не сработали... Бля, я что, зашкварен теперь?! Да не транс она.
>>888925 Начинать презенташку с "мы тут все женщины, делай с этим, проклятый цис-скам", а потом просить помощи - это какой-то просто next level маркетинга.
>>889385 > цис-скам Забавно, что ни мне, ни остальным присутствовавшим в зале даже в голову ничего такого не пришло (потому что она ничего такого и не говорила), но insecure slavshit как всегда нашел повод, чтобы обидеться, хе-хе.
>>889414 >в голову ничего такого не пришло Потому что ты живёшь с своём мирке, и тебя феминистки и прочие социальносправедливые воины ещё не заебали. >она ничего такого и не говорила Ой-вей, тебе цитатки дать? А вначале что это было? Ленгвидж мейд бай вимен, дил виз ит, експект зем ту нов беттер зан ю, мы тут не любим вайт цис-мелес и делаем свой язык как хотим - вот это вот всё? >обидеться Сколько тебе лет?
>>889385 >цис хуис маркетинг Сука, ебаное программирование. Только червь-пидор в 2016 году считает эту профессию илитной. Как хорошо было на васме, где ебанутых слали на хуй и поливали говном. А современное ойти целиком состоит из пидоров.
>>889423 Ну так если тебя заебали какие-то воображаемые враги, то почему мирок у меня, а?
Да, дай цитатки, где там про цис-скам было. У меня такое чувство, что ты либо не уловил поинта того, о чем они говорили, либо я даже не знаю. Если тебя так раздражает сам факт того, что бабы делают язык и могут быть более лучшими профессионалами, чем ты, то тут уж горбатого толлко могила исправит.
Обижаешься ты, а спрашиваешь сколько лет меня, хех. Немного меньше тридцати.
>>888804 какой-то толстый негр в нелепых рюшках промотал к концу, конечно не забыл всем напомнить что он transwoman of color проверил на гитхабе, в репе ничего кроме js/php делает как я понял всякие ui и фронтенды
>>889432 Пидоры не могут в программирование, и ни в какую другую разумную деятельность ввиду нарушений в работе ЦНС, проявляющейся в ригидной деградации интеллекта. Их сознание состоит из подобных фраз: >>889438 на 80-90 процентов, эти фразы настойчиво повторяются ежедневно, годами, почти без вариаций. Т.е., фактически, пидор - это просто сломанный спамбот, который несёт ненужную раздражающую пургу в пустоту.
>>889435 >Да, дай цитатки, где там про цис-скам было Не дам. Удалил видео уже. В самом начале, ещё до представления авторов языка он говорит про white cis-males. Наверное, даже до четвёртой минуты. И проблема в тебе, если ты знаешь, что социально-ориентированные подразумевают под white cis-males.
>>889467 > пидор > хуй Иди подрочи уже и успокойся.
>>889476 > Не дам. Конечно не дашь - ведь ты выдумал слова про проклятый цис-скам, и сам же на них и обиделся.
Вообще, это очень забавно, что их поинт как раз в том и состоит: "у меня есть пизда, но что имеет значение - это мой код, so let's talk about that" - и славскам, разумеется, гневно обсуждает их гениталии/гендер/социальную позицию - что угодно, кроме собственно кода. Ну хули делать, иди радио радонеж послушай да блинов с лопаты наверни.
>>889664 >Конечно не дашь Конечно, не дам. Что проще - мне скачать целиком видео, чтобы дать тебе точное время и получить в ответ "это нищитается и всё нитак", или тебе тыкнуть на ссылку, посмотреть это видео пять минут (первую даже можешь промотать) и самому во всём убедиться? Ведь, судя по всему, тебе важно победить в интернете, и видео ты смотреть не будешь, даже если я дам тебе точные секунды. >выдумал слова Ай-яй-яй. Да, там не было сказано слова "скам", но если ты посмотришь-таки видео, а потом пойдёшь на тумблер, сходишь в твиттеры и блоги феминисток, погуглишь social justice warriors, white male supremacy и т.д., то ты сам поймёшь, что мне не понравилось. Но, предупреждаю тебя, не лезь туда. После этого ты никогда больше не будешь прежним. Можешь не отвечать. Я, например, больше не буду, пока ты не ознакомишься с предметом. И вообще, иди-ка ты чекни свои привилегии.
>>889664 >"у меня есть пизда, но что имеет значение - это мой код, Это норма, когда хочешь обсудить свой код, но вступительное слово посвящено пизде? Может тоже стоит начинать совещния типа "У меня хуй, но давайте обсуждать проблемы на продакшене."?
>>889746 Зойчем тебе скачивать видео? Ты что, наркоман? Алсо, я как бы его смотрел (даже больше, лол) перед тем, как сюда вкинуть, сюрприз.
Ну и надеюсь ты сам понимаешь, как ты глупо выглядишь со стороны, признавая наконец, что ты выдумал эти слова (и на том спасибо, хех), но при этом продолжая нести ахинею в стиле "а вот если ты погуглишь то там будут хейтеры!! поэтому она тоже хейтер и ненавидит меня!!". Тут уж не привелегии, тут логику надо чекать.
>>889764 Вступительное слово посвящено комьюнити билдингу. И да, в цивилизованных белых странах это норма.
>>889766 >Зойчем тебе скачивать видео? Потому что прогрессивные веб-технологии, блягодаря которым у меня ютуб не работает. >я как бы его смотрел (даже больше, лол) Интересно, и что же ты с ним делал? Наяривал на белобрысую, небось?
>>889766 >поинт как раз в том и состоит: "у меня есть пизда, но что имеет значение >Вступительное слово посвящено комьюнити билдингу комьюнити билдинг - это что-то вроде свинг вечеринок для трансгендеров?
>>889776 >Дай угадаю Друг мой, да у тебя всё совсем плохо. Если сначала я ещё думал, что ты всего лишь не в теме, то чем дальше, тем больше убеждаюсь, что ты просто типичный сосачевский долбоёб. Вот ты уже нафантазировал и "лоллируешь". >Предлагаю >починить ютуб А вот теперь я уже в его глазах стал гуглом.
Решил попробовать пройти курс по структурам данных решая задачки на хаскелле, и на второй уже обосрался.
Надо посчитать высоту дерева за разумное время, на вход подается две строки: первая - колво нод, вторая - список указателей на родительские ноды, у корневой этот указатель равен -1.
на пример: 5 4 -1 4 1 1
это такое дерево: 1 |\ 3 4 / \ 0 2
На питоне решение написал, а на хаскеле не могу. Целый день просидел, ниче дельного в голову так и не пришло (хотя кажется что задача супер-тривиальная).
Анон, подскажи как переписать это на хаскел pastebin.com/mtXaNdNt
>>890119 Сам вкатываюсь потихоньку. Я бы так сделал: функция, в которой берем элемент, берем следующий элемент по индексу из значения предыдущего элемента и т.д. пока не получим -1, . Рекурсивно применяем эту же функцию для следующего элемента. Возвращаем максимальное количество шагов, полученных проходом по элементам и в результате применения функции к следующему элемету.
>>889786 >У меня такое чувство, что вместо гормонов она пьет пиво В 1952 году Алан Тьюринг был признан виновным по обвинениям в совершении «грубой непристойности» в соответствии с «поправкой Лабушера», согласно которой преследовали гомосексуальных мужчин. Тьюрингу был предоставлен выбор между принудительной гормональной терапией, призванной подавить либидо, или тюремным заключением. Учёный выбрал первое.
такое я уже писал, но оно не проходит тесты на больших деревьях (слишком долго считает), в питоновском варианте у меня есть переменная в которую я заношу уже пройденные ноды и не считаю их повторно, а как сделать подобное в haskell варианте - хз
>>890145 >такое я уже писал, но оно не проходит тесты на больших деревьях >пройденные ноды и не считаю их повторно Поскольку мы имеем чистые функции, хаскель может кэшировать результат применения функции к набору уникальных значений аргументов. В этом плане тебе ничего запоминать не надо. А считает долго из-за иммутабельности, при каждом применении функции создается копия твоего дерева. Тебе надо дерево как глобальный объект представить, но я пока ХЗ как это сделать. И вообще я не понимаю зачем там что-то повторно считать нужно.
>>890145 >в питоновском варианте у меня есть переменная в которую я заношу уже пройденные ноды и не считаю их повторно А что, есть шанс при подсчёте высоты наткнуться на ноду больше одного раза? Это же дерево.
>>890155 > хаскель может Даже кофе варить. Есть пруф что он варит? > при каждом применении функции создается копия твоего дерева С чего ты это взял?
>>890191 я и не строю, изначально мысль была следующая считать по порядку высоту для каждой ноды из списка на входе, попутно занося посчитанные ноды в отдельный список, чтобы не считать их по несколько раз, в принципе можно построить дерево, и посчитать его высоту как предлагали выше, но как сделать дерево из входного списка я тоже хз.
>>890197 у тебя вроде куска кода не хватает (deep2)
>>890145 >в питоновском варианте у меня есть переменная в которую я заношу уже пройденные ноды и не считаю их повторно Да, сорян, я тут >>890180 поторопился. Если ты не строишь дерево, то тебе, конечно же, нужна мемоизация. Data.Map.Strict поможет, надеюсь.
>>890202 >у тебя вроде куска кода не хватает (deep2) Это собственно весь код и есть. Опечатка, deep1 конечно. Здесь не строится дерево. Кстати можно оптимизацию небольшую сделать, строить высоту только для листьев. То есть для тех элементов списка, индексов которых собственно в списке нет. То есть в примере получается для 0 2 и 3 элементов. Можно условие в генераторе списка зафигачить. Завтра подумаю.
>>890230 Ну ты как там, переписал? Вообще хорошая задачка, помогает разбираться. Я вот переписал с мемоизацией. Не проверял работает или нет, но по идее должно. Следующий этап будет - своя мемоизация на IntMap, прямо как вот этот >>890229 анон наванговал.
>>890915 Ясно. В ФП на уровне чуть выше рекурсии списков и мапов с филтрами наш многоуважаемый опущ не умеет. Иначе как объяснить что простейшая программа с мемоизацией при помощи State Monad оказалась ему не под силу Зато он умеет рассуждать о том, кто здесь даун, а кто не очень, рассматривая кастомные темы в чужих редакторах. >>890916 Тебе пальцем показать, или лазерной указкой?
>>890917 >Ясно. В ФП на уровне чуть выше рекурсии списков и мапов с филтрами наш многоуважаемый опущ не умеет. Откуда такие выводы? > Тебе пальцем показать, или лазерной указкой? Как тебе удобнее.
>>890918 Например оттуда, что я зайдя в тредик за 15 минут накатал программку. А ты сподобился выдавить из себя "даун, даун, даун" и, в общем то, всё >Как тебе удобнее. Справа в буфере с интерпретатором, поступают на вход с функции treeDepth
>>890919 >Например оттуда, что я зайдя в тредик за 15 минут накатал программку. Молодец. Что не отменяет твоих незнаний элементарной теории множеств. >Справа в буфере с интерпретатором, поступают на вход с функции treeDepth Только treeDepth не считает число уникальных указателей.
>>890921 >Unit -тип содержащий один элемент >Тип >Теория множеств Ясно, понятно >Только treeDepth не считает число уникальных указателей. Да, не считает. Зачем их считать, их ведь 2^64
>>890910 >Ты дал совершенно даунский ответ на вполне понятно поставленный вопрос. Нет, непонятно. > Впрочем я и без тебя разобрался, не стоило Что, с пруфом "высота дерева == числу `указателей'" не получается?
>>890927 Какой ещё бред, даун? Это ты заметил, что высота дерева == числу уникальных указателей. Я тебя и спрашиваю, почему ты это не используешь. С пруфом проблемы?
>>890929 В предыдущем твоём посте ты проебал слово "уникальный", что изменило весь смысл на практически противоположный >Это ты заметил, что высота дерева == числу уникальных указателей Я попросил тебя переубедть меня. Ты не сподобился и я переубедил себя сам >С пруфом проблемы? Значение знаешь? Учи мемы чтобы не быть баттхёртом
Аноны, а в такой реализации fun2 мемоизируется, так как определена в бесточечном стиле через memoFix2, то есть при вычислении высоты дерева из определенного узла должны использоваться закешированные значения высоты из вышележащего узла, если они уже вычислены конечно. И fun4 тоже мемоизируется, так как определена в бесточечном виде, а l исплоьзуется из области видимости where. То есть при при обращении к значению списка по индексу, только данное значение добавляется в массив (из-за ленивости), и при следующем обращении будет обращение уже к массиву по индексу. Или я где-то ошибся в рассуждениях?
>>891064 > Какой смысл в мемоизации? Смысл в том, что дерево не строим. На входе у нас есть пары (вершина, родитель) и высоту считаем для вершины считаем как 1 + высота_от_родителя_до_корня
>>890938 Сам придумывай "4 -1 4 1 1 3" Высота по-прежнему 3, уникальных идентефикаторов - 4 >>891064 Потому что без мемоизации сложность по времени O(n^2)
>>891676 Можно ускорить выпиливанием ленивости через BangPatterns. Также, вместо IntMap можно мемоизировать ST массивом, и по идее это даст хороший прирост производительности, но код скорее всего получится не очень
>>892118 это входные данные (номерные файлы) и результат который должен получиться (файлы с расширением .a)
для линукса - выше скриптик был, для винды - хз.
Кстати по условию задачи все тесты должны прогоняться за 2 секунды
>>891806 BangPatterns ничего не меняют, пытаюсь разобраться с ST монадой. Я правильно понимаю что мне надо поменять State (IntMap) на State(STArray) и написать еще один метод, который будет обновлять значения в этом STArray?
>>892182 нет еще, я только сегодня третью сделал и надо сначала курс оплатить
Вообще я собираюсь в скалу вкатываться (с языком знаком + есть небольшой pet-проект), и думал поделать эти задачки чтобы разобраться в чисто-функциональном подходе и лучше применять его на практике. Но пока это больше похоже на преодолевание искусственно созданных трудностей, чем на что-то действительно полезное. И собственно вопрос - стоит ли продолжать, или это изначально бессмысленная затея?
>>892188 Ну пока лучшее решение на хаскелле - 25 строк. Насколько я понимаю узкое место там как раз IntMap с logn временем на поиск и добавление элементов, то есть надо переделывать на основе изменяемых массивов, а то что я пока нагуглил на эту тему выглядит как пиздец
>>892188 Решение на педоне: сажает робота на марс Решение на haskell: взрывается на старте из-за несоответствия временным критериям Зато на пять строчек короче!
>>892333 > несоответствия временным критериям Тому херу конечно виднее, но лично я сомневаюсь насчёт трёх секунд на все тесты. 3 секунды на 1 тест. Всё в порядке.
>>892340 Passing a code problem requires implementing a solution that passes all the tests for this problem in the grader and does so under the time and memory limits specified in the problem statement.
>>892355 В задании приводятся Constraints и TIme Limits, но не приводится число тестов. Значит это Time Limits для данных Constraints.
> passes all the tests for this problem in the grader and does so under the time and memory limits specified in the problem statement. Ну да. А specified было так, как я описал выше.
Слюшай, думаешь, я не сидел в подобных решалках задач? Сидел (но немного, т.к. в моё время на выбор давались C++ и Pascal, а это уныло). Везде подразумевалось время на решение для одного примера входных данных
Кстати, на скрине время для какого языка и варианта?
>>892384 >а может ты и прав... Нет, ну сможешь создать условия, при которых каждый тест укладывается в ограничения, а в сумме они не укладываются и система зарежектит такой вариант, то ок. Но это крайне маловероятно. Сегодня набор тестов один, завтра — другой. Ограничения на время указывают для ограничений на размер входных данных.
>>893135 Вот только например на 20 тесте твой массив будет иметь 100000 элеметов, а мой мап всего 2. Аналогично на других тестах, мап будет содержать не так много элементов, как кажется - только для уникальных узлов
Помимо прочих ништяков, он Foldable, т.е. для нахождения максимума не нужно перегонять его в список.
Как мне кажется, отчего Хаксель больше страдает, это от переупаковок данных туда-сюда. Из строки в список чисел, из списка чисел в массив, анбоксинг, боксинг Int-ов, опять превращение в список и т.д. Создание списка для mapM_, только для того, чтобы вызвать функцию для каждого номера вершины.
>>893144 >Вот только например на 20 тесте твой массив будет иметь 100000 элеметов, а мой мап всего 2. И всё равно работает медленнее.
Array выделяется 1 раз и хранит unboxed Int-ы (если это STUArray/IOUArray; U = Unboxed). А Map зделан поверх дерева, при доступе и добавлении куча сравнений и хождения по указателям.
>>893152 >Как мне кажется, отчего Хаксель больше страдает, это от переупаковок данных туда-сюда. Хотя нет, даже не от этого. От нестрогости. Для того, чтобы найти высоту дерева, нужно узнать высоты ВСЕХ поддеревьев. Т.е. задача сама по себе "энергичная". И нестрогий язык заведомо проиграет, т.к. будет бесполезно тратить время на создание thunk-ов, которые всё равно все будут вычислены.
Книги
Types and Programming Languages ru: http://rgho.st/79l9wvVcQ en: http://rgho.st/8tSBffPsH
Structure and Interpretation of Computer Programs ru: http://rgho.st/8MgrHrCcc en: http://web.mit.edu/alexmv/6.037/sicp.pdf
Introduction to Functional Programming ru: http://rgho.st/7mf8HCkmx
Haskell
https://hackage.haskell.org/
https://wiki.haskell.org/Haskell
https://www.haskell.org/documentation
Книги
Real World Haskell en: http://book.realworldhaskell.org/
Learn You a Haskell for Great Good ru: http://rgho.st/6NzMmnvDS en: http://learnyouahaskell.com/ http://rgho.st/6QLkJb5jT
Учебник по Haskell https://anton-k.github.io/ru-haskell-book/book/home.html
Beginning Haskell en: http://rgho.st/8pG4TYdnp
Clojure
http://clojure.org/
http://clojurescript.org/
http://www.learn-clojure.com/
http://www.braveclojure.com/
https://youtube.com/user/ClojureTV
https://clojuregazette.com/
Книги
Clojure Programming http://rgho.st/7wGxqJj54
The Joy of Clojure http://rgho.st/6dyRBG9rg
OCaml
http://caml.inria.fr/pub/docs/manual-ocaml/
https://ocaml.org/docs/
Книги
Real World OCaml en: http://rgho.st/6gCfxmLyy
Архив тредов
1. https://arhivach.org/thread/214184/