24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Что читать? Я ебу, сам через жопу читаю вот это: http://learnyouahaskell.com/chapters Походу, я единственный и не очень умный вкатывальщик в этот странный язык.
Вопрос по созданию простейшей хуйни на функиональщине. Вот я захотел сделать телеграм бота, но так как в ФП я вообще не шарю, решил сначала продумать базовую архитектуру: в боте есть список аккаунтов, инфа в которых постоянно меняется. На императивном языке я бы просто поменял пару параметров, но тут пришлось использовать "костыль" в виде рекурсии и пересоздания списка. на пике 2 неработающая, но читабельная версия. Разве это не громоздко? Мне кажется, я делаю хуйню. >>1343138 или мне лучше вместо таких тупых вопросов почитать книжки, где обьясняется, как мыслить функционально?
О! Только хотел пойти в общий тред, а тут тред запилили! Ещё один вкатывающийся заворачиватель Hello World во все монады по очереди.
Видел мануал, где начинают не с описания няшных типов и классов, а с хардкорного main = do <in out operations> хоть как-то похожего на реальные задачи. Не могу вспомнить название, может анон доставит?
>>1343143 Костыль-то зачем сделол? Рекорды можно юзать так же как и нерекорды: data A a = A {x::a, y::a}; A {x = 1, y = 2} === A 1 2. Иль ты решил сокрыть стандартный конструктор и в будущем сделоть умный конструктор?
Во-первых parse у тебя неправильно называется, это splitWithSpace, во-вторых перемудрил, в-третьих есть стандартные функции для разделения строки.
В onMessage у тебя бизнес-логика, лень разбираться.
В хачкиле самое сложное это его установка, блядь. Установить чтото по мануалам просто нереально. Cabal mamuebal install zaloopa-1.0.3 @ error блабла. Вроде разобрался со стеком и использованием lts, слава яйцам, вне стека хачкель неработоспособная параша.
>>1343135 (OP) ПАЦАНЫ, Я СЕГОДНЯ ШЁЛ КОРОЧЕ ПО ГОРОДУ И УВИДЕЛ ЧЕЛА В МАЙКЕ ">>=", НУ Я ПОДСКОЧИЛ И РЕЗКО ПЕРЕЕБАЛ ЕМУ В ЩЩИ С ВЕРТУШКИ И ПОЯСНИЛ ЕГО КРИКОМ "НЕ ЛЮБЛЮ МОНАДЫ", ПОТОМУ ЧТО Я УГОРЕЛ ПО ЛИСПУ, ПАЦАНЫ ДУХ СТАРОЙ ШКОЛЫ ЖИВЁТ ТОЛЬКО В НАСТОЯЩЕЙ ФУНКЦИОНАЛЬЩИНЕ, ГДЕ ЕБАШАТСЯ ПО ХАРДКОРУ, ГДЕ ПАЦАНЫ ЖИВУТ МЕТАПРОГРАММИРОВАНИЕМ, ИНТЕРАКТИВНОЙ РАЗРАБОТКОЙ И ЕБУТ СИСТЕМУ В РОТ! ТОЛЬКО ЛИСП ТОЛЬКО ГОМОИКОННОСТЬ, ТОЛЬКО СКОБКИ!!! ЮНИТИ УЛЬТРАХАРДКОР ЛИСП!!! пацаны ебашьте скалоблядей, эфшарперов, крестовиков, формошлепов, академиков, угарайте по метарекурсии любите Лисп, репл и Скобки! ГОВОРИТЕ ОТКРЫТО И СМЕЛО ПРЯМО В ЛИЦО! ЛИСП!
А еще есть hoogle, замечательная штука, там можно икать документацию для модулей и функций, причем не только по имени, но и только по типам, очень удобно
>>1343137 Зачем тебе еще один конструктор? У тебя уже есть Account :: [Char] -> Int -> Account можешь прям так и писать: let vasya = Account "xXxNagibat0RxXx" 7 petya = Account "~~n00pPWNR666~~" 6 in ktoChyuMamkyEbal vasya petya
>>1343143 > "костыль" в виде рекурсии и пересоздания списка Если я тебя правильно понял, то это не костыль, а идиоматичный подход с использованием иммутабельных структур данных (например, https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf - "Purely Functional Data Structures" Chris Okasaki).
Используй https://www.haskell.org/hoogle/ для поиска функций по типам, большая часть того что ты написал уже реализована и оптимизирована.
Для простейшего парсинга лучше использовать Data.Text, там можно и делить строки по символам и выдавать подстроку и все остальное.
>>1344964 Я сказал юзабельное, а не очередной туториал, библиотеку для хаскелла, учебное задание по туториалу, байндинг. Т.е. чтобы конечный пользователь, нихера не знающий про хаскелл запустил программу для своих нужд, а она на хаскелле написана? Что вообще на нём кошерно писать?
>>1344995 Pandoc есть, например; эта контора https://www.tweag.io/ делает продукты на Х. А так в телеге спроси в @haskellru, там пояснят, скорее всего.
>>1343138 За риал ворлд хаскель спасибо. Меня уже тоншить начало от learn your haskell, потому что задач никаких не было, а с фантазией у меня хуево. хотя я все равно нихуя, кроме трех задачек, не сделал >>1344959 хуевый подход - у меня та же императивщина, только все состояния я передаю через рекурсию. Да и одна главная, огромная функция такая себе хуйня. Наверное, лучше разделить все на кучу независимых функций и пихать их в IO. Мб выучу монады и буду пытаться заебашить все методом проб и ошибок. или ебанусь и пойду читать сикп
>>1346072 >За риал ворлд хаскель спасибо Будь осторожен, он вроде пиздецки старый и об этом надо помнить постоянно. Но глава про парсинг здорово помогла мне с пониманием монад в своё время.
Сука какой же я даун. Два дня ебался со сканировкой грэхэма и только сегодня заметил опечатку, из-за которой все летело к хуям. Алсо, вот так можно делать?
Нахуя нужны partial functions? Что это вообще за костыль, почему бы просто не задавать каждой функции при ее определени область определения? Примерно в таком виде, как тут: >>1346568 Тогда бы, например, у diva была бы область forall a. Integral a, forall b. Integral b /= 0 -> a -> b -> a и тогда бы эти ошибки исправлялись на этапе компиляции.
Почему великие гении-создатели хацкеля не сделали так?
>>1346814 Потому что для этого нужны зависимые типы, а их ещё не завезли в хаскель в полном объёме. Кочай Idris, определяй область определения. Ну или пошерсти расширения хаскеля на предмет этого конкретно. https://gist.github.com/edwinb/0047a2aff46a0f49c881
>>1346851 прочитал про зависимые типы. Это что-то типа геттеров/сеттеров из ооп? А при чем тут область значений/определений? > Кочай Idris, определяй область определения. Мне бы для начала хацкель на уровне хеллоуворлдщика изучить
>>1346965 Зависимые типы позволяют типам зависеть от значений или на соотношениях между значениями. Например, выдержка с википедии: In computer science and logic, a dependent type is a type whose definition depends on a value. A "pair of integers" is a type. A "pair of integers where the second is greater than the first" is a dependent type because of the dependence on the value.
Ну раз ты новичёк, забей пока, осваивай базовый хаскель и просто знай что такое есть.
>>1346985 Дженерики это обычные forall, а эти зависимые типы их не очень напоминают. >>1346997 > In computer science and logic, a dependent type is a type whose definition depends on a value. A "pair of integers" is a type. A "pair of integers where the second is greater than the first" is a dependent type because of the dependence on the value. Так более понятно. Этот пример более показательный, чем с вектором. все таки иногда надо открывать англ вики, она может быть более понятной, чем русская
> Потому что для этого нужны зависимые типы, а их ещё не завезли в хаскель в полном объёме. >еще А в хаскель их планируют добавлять? Ну а вообще, я не понимаю в чем смысл этих maybe, монад я их еще не учил, если что, если даже у функции head есть ексепшны? Хотелось бы полностью ексепшн-лесс язык.
Пиздец во что скатилась эта параша. Года 3 назад были треды по зависимым типам, с серьёзным обсуждением не только всех этих идрисов итд, но и теории типов. А сейчас что? Полтора школопитека, один из которых спрашивает "что за буква А перевёрнутая?", другой про зависимые типы такую хуету понес, что даже цитировать стыдно.
>>1347012 > Года 3 назад А недели две назад хаскель треда даже не существовало. >Полтора школопитека, один из которых спрашивает "что за буква А перевёрнутая?", другой про зависимые типы такую хуету понес, что даже цитировать стыдно. Вообще-то я один школопитек.
>>1346631 У американцев есть поговорка: "Все что было в Вегасе, остается в Вегасе", так вот с монадой IO точно такая же история. Операции ввода-вывода это операции с побочными эффектами, и когда мы их заворачиваем в IO, мы изолируем эти операции от чистых функций.
Сап двач! В чем лучше писать на сабже? Думак про емакс и вим, но для вима хаскель режим сдох, а из емакса хер сделаешь конфетку (свечку не держал, пруфов не будет).
>>1347012 Харкачую, пока "что за А перевёрнутая" - на пыхе бабло рубят, я хуй без соли доедаю, видно такова уж судьба. Так что, дропайте FP, найдите себе тянку, форд фокус в кредит, дачку. А FP для ебанутых, не ломайте себе жизнь.
>>1347012 Все время кажется, что дальше падать уже некуда, и все равно со временем средний технический уровень постеров падает. Вот такой вот парадокс.
>>1346106 Как там сделать build environment, чтобы был ghc с пакетами и можно было кабалом собирать? В гугле ничего толком не нашёл, в мануале тоже. Ну или, если guix можно юзать как билд-систему, какая там поддержка ghc?
>>1346609 >у языка большой порог вхождения Да, это так. >Знать надо дохуя: лямбда-счисление, теория категорий Нет, вообще нет, откуда вы это берёте блиа!
>>1346631 Если видишь сигнатуру () -> String в хаскелле, можно смело предполагать, что она ничего не делает. Не запускает ядерные ракеты, не пересобирает ядро, не шлёт запросы в базу данных, и т. п. Язык позволяет явно выделить "грязный" код с вводом-выводом и другими эффектами. Вся бизнес-логика должна оставаться в чистой части, вообще без эффектов. Тогда её легко тестировать и трудно сломать.
>>1347011 >в чем смысл этих maybe ..., если даже у функции head есть ексепшны? Это недостаток, исторически сохранившийся в части стандартной библиотеки. Можно взять другую, где такого нет, и жить спокойно. >Хотелось бы полностью ексепшн-лесс язык Увы, не получится. Совсем никак. В чистом коде ещё можно, но как только начинается ввод-вывод - эксепшены на эксепшенах. Причём в хаскелле они могут реально стать проблемой.
>>1347158 Емакс однозначно. haskell-mode + company-ghci Можешь также попробовать ghcid плагин к vscode. Всё остальное даже не пытайся, это просто унылый анальный дрочь, зря потратишь время и выбросишь в мусорку что получилось.
>>1343135 (OP) Могу порекомендовать блог https://www.parsonsmatt.org/ Сразу ничего не поймёшь, конечно, но будет ориентир, к чему стремиться и как делать. Я начинал с learnyouahaskell, после прочтения долго не мог выйти на следующий уровень, чтение блогов и реддита очень сильно помогло.
Как же хорошо быть студентиком, рантьебогом или просто хиккой-домоседом и пописывать велосипеды на хачкиле. Но когда ты вынужден писать на мэйнстрим параше, только потому что за неё платят реальные деньги, здесь все твои мечты разбиты и ничего, кроме бессильной досады не остаётся.
>>1347669 Да, на словах звучит красиво и понятно, но я не вижу как это лучше на практике. Можешь привести пример? Я просто читаю learnyouhaskell и там работа с IO начинается еще до всех этих монад (что как я понял просто тайп-класс).
>>1347845 Какой пример-то тут нужен? Есть два вида функций: те, которые всегда на одних и тех же входах выдают одно и то же значение, и те, которые могут выдавать разное в зависимости от фазы луны, и при этом стрелять тебе в ногу. Первые удобно тестировать и отлаживать, в них меньше пространства для ошибок, вторые неудобно, и хорошо, когда их можно явно разделить.
Монады - это просто удобный синтаксис для вычислений с эффектами. do-нотация - это просто засахаренная версия того же синтаксиса.
А вообще, вот есть полезный хинт для понимания того, как в хаскеле работают с эффектами: на самом деле, "IO a" - это такой материализованный "список дел", который можно передавать в функции и возвращать. Конечный результат этих манипуляций заключается в составлении одного большого "списка дел", который называется main. Он передаётся в рантайм и там исполняется. С такой точки зрения, вообще все функции в хаскелле чистые.
>>1347678 Или я не понял, что такое синонимы типов, или в этих ваших хаскелях какие-то костыли неработающие. неужели ghc так сложно преобразовать Point в Floating a => (a,a)?
>>1347925 Ты пытаешься взять конкатенацию списка и его головы. Естественно, оно не будет чекаться, вне зависимости извращений, которые ты пытаешься наворотить.
>>1347962 Потенциальное отсутствие значения. Я вижу, что ты пытаешься сказать - слишком общее определение для слова "эффект". Да, но в теоретических работах, да и на практике, всегда получается, что реальные эффекты типа ввода-вывода соседствуют со всякими прочими вычислительными контекстами в рамках одной парадигмы, потому что это похожие механизмы.
>>1347012 > Года 3 назад были треды по зависимым типам, с серьёзным обсуждением не только всех этих идрисов итд, но и теории типов Ну не пизди. Какое может быть ОБСУЖДЕНИЕ подобной хуйни? ФП - это как наркотик, ты начинаешь с лиспа, думая о том, как это поможет стать крутым программистом, а заканчиваешь пруверами и требуешь еще. Аутисты тех лет повырастали (см. судьбу Никиты Садкова, например). Новым аутистам эта тема уже не так интересна, потому что хайп ФП прошел. Лямбды в C# - 2007, лямбды в С++ - 2011, лямбды в java - 2014 и так далее. Если ты был школьником в 2010, вокруг было - ФП, ФП, ФП. Кто-то из этих школьников в 2013 сторчался до идрисов и агд. А потом - все, хайп ФП прошел.
Расскажите нубу, как в общих чертах выглядит условный web-api. Задача: к нам приходит GET /hello/{user_id} мы должны сходить с условную БД за именем пользователя по его ID, прочитать условную локализацию приветствия из конфига и провернув это через бизнес-логику, в нашем случае вставление имени пользователя в шаблон, вернуть пользователю.
Как выглядит такая архитектура в хаскелле? У нас получается чистая функция в бизнес логике, но и входы и выходы у неё IO, правильно? Как решается вопрос многопоточности?
>>1347678 >Увы, не получится. Совсем никак. В чистом коде ещё можно, но как только начинается ввод-вывод - эксепшены на эксепшенах. Причём в хаскелле они могут реально стать проблемой. Но можно кидать везде maybe или что-то типа data a = Just a | exception1 | exception2 ... Тогда в рантайме ексепшнов не будет.
>>1344026 Так и не вдуплил как прогонять список через рекурсию, есть задача >Вернуть первый элемент списка натуральных чисел, кратный 5. При отсутствии такого элемента вернуть 0; Я делаю так check [] = [] -- выставил базу check [x:xs] | (mod x 5)==0 = check xs | otherwise = 0 Читал уже про определение функций, рекусрусий, смарел примеры, пробовал определять типы для функции в repl, они там не пашут даж, брал с примеров. Вот я mod x 5 чекаю на кратность дальше в теле функции мне следовательно выводить его надо, дайте подсказку
>>1347011 >в чем смысл этих maybe, монад я их еще не учил, если что, если даже у функции head есть ексепшны? Неправильная постановка вопроса, правильно: в чем смысл этих head, если есть монады? И ответ: никакого смысла, просто так исторически сложилось (стандартная библиотека - говно)
>>1351108 >>1351139 Я хочу на чистой рекурсии, чтобы понять рекурсию. С функциями высших порядков каждый сможет. Вот для начала как мне управлять индексом через паттернг матчинг, допустим каждый элемент умножить на джва.
>>1351501 > допустим каждый элемент умножить на джва. Тогда тебе надо x на два умножать, а не xs, x это первый элемент списка, а xs хвост списка, то есть тоже список, нельзя сложить элемент и список, вместо плюса тебе надо использовать оператор присоединения к списку - двоеточие. К тому же, в данном случае интерпретатор решает, что ты переопределил функцию go, так что надо либо как здесь советуют поступить >>1351511 >Пиши в одной строке через точку с запятой, или в файле как нормальные люди. либо использовать в интерпретаторе такую конструкцию для многострочного ввода :{\n<строчки кода>\n:}
>>1351501 >допустим каждый элемент умножить на джва. Такое надо делать так:
doubleItems = map (*2)
>Я хочу на чистой рекурсии, чтобы понять рекурсию. С функциями высших порядков каждый сможет. Так начни с того, что реализуй основные такие функции, всяческие map, foldl, filter, и прочие. Отличное упражнение, как раз на рекурсию, они же через нее реализуются.
>>1351502 Ты упустил определение фунукции. Каждая функция что-то принимает т что-то возвращает. Напртмер, (+) принимает все, что есть членом класса Num, а (++) примает два массива и выдает новый. Ты не можешь применить ++ к немассиву, а (+) к тому, что не есть членом Num. как ты это делал тут >>1351501 и тут >>1351045
Мне кажется, ты вообще нихуя не читал - прочитай хотя бы learnyourhaskell до модулей включительно.
>>1351501 fold это та же рекурсия (x:xs), прочитай в том же learnyourhaskell, как она работает.
Проверьте на быдло код, вроде разобралс, осталос выспаться > Вернуть первый элемент списка натуральных чисел, кратный 5. При отсутствии такого элемента вернуть 0 Результ: 5 И если пилить эту же задачу с if then else то различие ток в сахаре?
>>1352207 Я бы так сделал. В условии сказано, что список натуральных чисел, так что проверка на "больше нуля" избыточна. >И если пилить эту же задачу с if then else то различие ток в сахаре? Естественно, а какое тут может быть различие?
>>1352207 Тебя элемент просят вернуть, а не список. [Int]->Int, лучше даже Integral a => [a] -> a. Если хочешь первый элемент, то вместо take 1 можно взять функцию head, она возвращает первый элемент списка, его "голову"
>>1352963 Это дело хорошее, но я добавлю, что можно ещё сразу просто взять и начать писать. Ну, чтобы ни у кого не возникало иллюзий о недоступности языка для простых смертных.
> удалить из списка элементы, индексы которых кратны 3 Пытаюсь запилить, опять намудил с типами компилятор Арёт уже что я мудило Ошибки в 4 и 9 строках, прошу подсказку
module Main where
main :: IO () main = print $ check [1..10] 0
check :: [a] -> (a -> Int) -> [a] check [] _ = [] check (x:xs) i | (mod i 3) > 0 = x | otherwise = check xs (i+1)
>>1355231 Функция должна возвращать массив, а в 9й строчке она у тебя возвращает a, а не [a]. Алсо, на этой же строчке ты пытаешься получить остаток от деления функции на тройку - ты ебобо?
Учись читать маты компилятора, а не задавать вопросы в тред.
>>1355255 даже если мне добавить x: xs, это не исправит, я ваще запутолс, какую главу мне перечитывать? Скок примеров всяких рекурсий и сурсы функций стандартной либы смотрел, я не вижу этот простой паттерн, управлять счетчиком. Рекурсию вроде понял вот я и делаю в guard выражении остаток больше нуля и сопостовляю в образец нового списка.
>>1355255 >Учись читать маты компилятора, а не задавать вопросы в тред Более уебищный высер чем у GHC только у плюсов когда ошибка в шаблонах. Это реально нечитаемая хуета.
>>1355351 Похоже, что ты вообще программировать недавно начал. Тут никакая глава не поможет. >этот простой паттерн, управлять счетчиком Обычно такое можно обнаружить в текстах про хвостовую рекурсию, где берётся какая-нибудь нехвостовая функция и переделывается в хвостовую путём прицепления аккумуляторного аргумента. Получается вещь, очень похожая на for-цикл. Но вообще, конечно, явную рекурсию писать не надо, по возможности.
Твой пример решается так: check :: [Int] -> Int -> [Int] check [] _ = [] check (x:xs) i | i `mod` 3 == 0 = x : (check xs $ i + 1) | otherwise = check xs $ i + 1
>>1355404 Я могу понять, если у тебя сплошной темплейт хаскелль и десяток расширений на файл. Но если ты не можешь прочитать элементарную херню вроде той, которая выдаётся в примере с делящимися индексами, то проблемы на твоей стороне.
>>1355419 Сразу ещё напишу более лучший вариант без явной рекурсии: check' :: Integral a => [a] -> [a] check' xs = map snd filtered __where ____filtered = filter ((== 0) . (`mod` 3) . fst) indexed ____indexed = zip indices xs ____indices = [0 .. length xs - 1]
>>1355404 Если нигде не указывать типы, то высер вполне может быть нечитаемым. Но, если прописать ручками желаемый тип в том месте, где ошибка вылезла, то высер становится очень даже приятным.
>>1355419 Да да, можешь не выебываться шо ты можешь мне пояснить за никому не нужные аппликативные функторы и монады, ведь у тебя здесь смысловая ошибка, хА! > | i `mod` 3 == 0 = x : (check xs $ i + 1)
>>1355901 Затраллен, иди исправляй свою ошибку, (mod i 3) > 0 А так спасибо, пониал паттерн, запилил себе поиск по списку строк, ща пролог буду доделывать, там еще угарнее
А вообще, можешь просто взять задачки для изучения любого другого языка, и решать их на хаскелле, а можешь свои какие-нибудь задачки придумать, типа вот, понадобилась тебе какая-нибудь программка, а напишу ка я ее на хаскелле. И насчет примеров из книжек, ты их не просто читай, а вводи, исполняй, исследуй их, играйся с ними.
Читаю книгу со слоником на обложке. Но люто печет с того что не работают некоторые примеры, например на странице 48 есть такой код https://pastebin.com/iFmkLgim, но я получаю тонну ошибок. И это не единичный случай, щито делать?
>>1360205 Там надо в стрелке, в списочном выражении, минус поставить, а то там другой знак, похоже, тире. >removeNonUppercase st = [ c | c <– st, c `elem` ['A'..'Z']] Надо не так <–, а вот так <- removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']] Я с таким сталкивался, в примерах в книжках, для красоты видимо, не все символы точно такие, какие ожидает ghc, а просто похожие на вид, так что, когда копируешь примеры можешь столкнуться с такими вот ошибками, это часто касалось апострофов, тире и кавычек.
>>1364444 Ну, всегда же есть какие-то удачные приемы, лучшие практики и все такое. Надо же использовать опыт предыдущих поколений, чтобы двигаться вперед.
>>1364437 А про архитектуру крупных приложений в функциональном стиле там есть? Или, когда планируют архитектуру в принципе не важно на каком языке и в какой парадигме собираются писать?
>>1364600 Паттерены тут при всем, потому что само слово паттерен означает образец. Так-то в хаскеле все эти монады и функторы являются паттеренами, это же обычные классы типов, просто в джаве абстрактные фабрики фасадов синглтонов, а в хаскеле монады, комонады, функторы, аппликативные функторы, мноиды и прочие
>>1364514 >голубая книжка, только там Scala. Я знаю про smalltalk есть голубая книжка, а еще у Михаила Зощенко есть "Голубая книга", сборник сатирических новелл, в общем, если поискать, много есть всяких голубых книжек, а какую ты имеешь в виду? Беглый гуглеж ничего не дал.
>>1366767 Ну да, а алгебраические типы - это немного более, чем рекорды с енумами. И вообще, этот ваш хаскель - всего лишь немного более, чем джаваскрипт какой-нибудь.
>>1367118 Монада это мосив, а это >моноид в моноидальной категории эндофункторов всего лишь базовые понятия из алгебры без особенной глубины, которыми ты можешь вечатлить только даунов из /pr.
>>1366767 Смотри, например, в джаве паттерен наблюдатель реализуется с помощью классов, это особым образом организованные классы, паттерен наблюдатель это не какая-то встроенная в джаву вещь, это прием программирования.
Монады и функторы организуются в хаскеле с помощью классов типов, это просто специальные классы типов, это не какая-то встроенная в язык вещь, это просто прием программирования, поэтому, можно сказать, что это паттерены. Вот что имел в виду.
>>1367126 >Только некоторые школьники думают, что на нём академики пишут. А некоторые школьники не следят за публикациями по CS за последние, гхм, 25 лет.
>>1367188 У классов ООП и тайпклассов хаскеля из общего только 5 букв: к, л, а, с, с.
Различия между паттернами в ООП и манатками следующее.
Паттерны в ООП - это часть задуманной архитектуры (шаблоны проектирвоания). ООПист сидит и думает: агааа, тут нужно заебенить изменяемое поведение, значит тут визитор, тут нужна композиция объектов, хуяк, DI навставляю итд.
Функциональщик измышляет композицией функций. Именно композицию и можно назвать шаблоном проектирования в ФП. Но, нахуя, если композиция - суть программирования в любом подходе. Он, не думает "тут у нас побочные эффекты, заебеню-ка я манаду, или аппликативный функтор", тем более, что написать код для монадки еще пол дела: попробуй докажи, что не верблюд, и твоя реализация удовлетворяет всем законам, иначе соснешь в продакшене. Функциональщик собирает композицию функций, при этом у него иногда получаются до боли знакомые комбинаторы (байнд, например) и он с удовольствием этим пользуется, получая нахаляву еще пару-тройку комбинаторов.
>>1367342 Ну на деле современный функциональщик (хаскеллист) берёт либу типа mtl или capabilities (если он совсем продвинутый), ебенит монадный стек через трансформеры и дерайвит всевозможные инстансы, чтобы бесплатно получить комбинаторы и их писать. Я вообще не помню, когда бы мне приходилось писать прямо свой оригинальный инстанс монад или аппликативов.
Хуясе тут ньюфагов развелось. Да еще со всякими страданиями. Ладно, как дедушка хаскельдрочерства, поделюсь советами дедушки как не страдать.
1. Не пытайтесь устанавливать ghc или платформу вручную. Я не могу придумать ни одной причины, по которой ньюфагу потребовалось бы качать дистрибутив ghc. Используйте Stack https://haskellstack.org Про cabal-install вообще забудьте пока не узнаете про сэндбоксы, иначе рано или поздно разнесёте систему и вам придётся всё переинсталлировать. Впрочем знать что-то про сэндбоксы вам нахрен не нужно, просто используйте Stack там всё есть и он просто работает, там уже всё придумали за вас.
2. Не создавайте проекты вручную и не редактируйте вручную cabal-файлы. Есть команда stack new и файл package.yaml, из которого hpack сгенерирует всё необходимое, причем в случае stack-а, вам не нужно знать, что такое hpack. Нет, если вам хочется вручную указывать всё модули своего проекта и потом каждый раз править .cabal, когда вы что-то рефакторите, то пожалуйста, но такой хуйнёй даже джависты не занимаются, они давно придумали IDE для этих целей.
3. Кстати, используйте IDE. И нет, блядь, не Leksah. Скачайте что-нибудь современное и адекватное, например Visual Studio Code, скомпилируйте https://github.com/haskell/haskell-ide-engine (stack-ом, естественно, как написано в их документации, а не ручками) установите плагин Haskell Language Server и будет вам шастье. Еще есть очень полезная команда "stack ghci", которую следует запускать в окне терминала этого самого Visual Studio Code, чтобы можно было быстро тестировать ваши программы и команда :r внутри ghci, чтобы перезагружать отредактированные исходники. И если вы под виндой, используйте stack ./install.hs hie-8.6.4, чтобы использовать GHC 8.6.4, потому что в GHC 8.6.3 серьёзно накосячили и он под виндой подвисает.
4. Не используйте стандартную прелюдию. Особенно, если вы не знаете, чем String в Хаскелле отличается от String в Джаве. Вообще, поставьте NoImplicitPrelude в своём шаблоне для новых проектов и используйте вместо неё rio https://github.com/commercialhaskell/rio В прелюдии нет ничего плохого и я сам её никогда не отключаю, но я - дедушка, мне можно, а вот вам она нахрен не нужна, будете только слёзы и сопли по клавиатуре размазывать от того, что ваш говнокод на Хаскелле внезапно окажется в 10 раз медленне аналогичного говнокода на Питоне.
5. Вообще, прочитайте всё, что написано в rio https://github.com/commercialhaskell/rio и сделайте именно так. Пока вы ньюфаги и только изучаете Хачкель, у вас нет никаких причин делать что-то иначе.
6. Пишите на идиоматичном Хаскелле. Пытаться эмулировать на Хаскелле императивные алгоритмы используюя IORef - плохая идея, особенно если вы не знаете, что IORef боксит значения, а если вы не знаете, что modifyIORef - ленивая, то вообще пиздец. Да, на Хаскелле можно заниматься императивным программированием и низкоуровневыми оптимизациями, но пока вы не умеете читать Core Language, вам лучше вообще туда не лезть, в 99% случаев компилятор сделает это лучше, чем вы.
7. Освойте такие инструменты как criterion и weigh. Да, Хаскель сука быстрый, как С++. Но это декларативный язык и он использует очень много черной магии, чтобы превратить ваши декларативные описания в последовательность процессорных команд. И если ты ньюфаг и не можешь знать как твоя писанина транслируется в ассемблер и почему какая-то хуйня может быть оптимизирована, а какая-то - нет, просто используй criterion и weigh для отслеживания производительности.
>>1367102 Он абсолютно прав. Моняды и функторы являются паттеренами на которых построены практически все интерфейсы хачкельбиблиотек. Вопрос лишь в том, являются ли эти паттерны первоклассными, т.е. выражаются ли они средствами языка. В случае ООП - нет. Т.е. какой-нибудь ОО-синглетон - это просто какой-нибудь AbstractSingletonProxyFactoryBean, его семантика описана в документации, она, так сказать, воображаемая. А в случае Хачкеля большинство паттернов описываются и чекаются самим языком. Именно поэтому Хачкель так хорош. Когда я вижу монаду или функтор, мне не надо лезть в документацию, я знаю, каким правилам подчиняется данная конструкция, они формализированы на уровне языка. Когда я вижу AbstractSingletonProxyFactoryBean, мне надо разбираться, что имел ввиду автор, потому что язык мне не скажет ничего, мне надо понимать кучу скрытых правил, как их правильно использовать.
Во-первых, я тем постом как бы намекал, что монада - это паттерн программирования вообще, необязательно программирования, а уж какими средствами он выражается в конкретном языке - это дело десятое. Переводя на язык ООП, это как в ответ на "билдер - это паттерн" писать "нет, билдер это же просто класс))".
Во-вторых, >Когда я вижу монаду или функтор, мне не надо лезть в документацию, я знаю, каким правилам подчиняется данная конструкция, они формализированы на уровне языка - тупорылая манька, иди хаскельвики читай, monad laws у него реализованы на уровне языка, угу. Обоссал тебя.
>>1368096 > паттерн программирования Сам термин придумал, сам
>"билдер - это паттерн" писать "нет, билдер это же просто класс))" Ебать логика у тебя.
Билдер - это шаблон проектирования. ПирожокБилдер - это конкретный класс, созданный по шаблону Билдери то не факт.
Функтор - это тайпкласс, в простонародии интерфейс. Functor [] - реализация этого интерфейса для списка. Где тут, блять, ты узрел шаблон проектирования?
>>1343135 (OP) Я не могу въехать где в физической реализации функционального программирование имеется тот самый стейтлесс о котором все так радостно воркуют.
Какая принципиальная разница между тем что у нас есть условные контейнеры в памяти, к которым обращаются функции, и когда у нас есть общая среда где контейнеров нет но всё равно есть постоянно модифицируемые сущности?
У меня после курса архитектуры компьютера такое чувство что меня подъебать пытаются.
>>1368378 >У меня после курса архитектуры компьютера такое чувство что меня подъебать пытаются Так и есть. Не ведись на хайп гуманитариев-функциональщиков. В жопу трахаться не так стыдно, как быть функцинальщиков.
>>1368405 Ну как сказать, мне наоборот в целом их подход нравится. Однако этот момент со стейтами прям коробит. Я ещё могу понять маняпуляции вокруг того что I/O - вынужденное "зло" относительно чистых функций. Но когда мне пишут про отсутствие состояний при этом имея сущности в локальной среде, целые хранилища с правилами и даже прямые модификациями как ОЗУ так и файловой системы - уж извините, но тут что-то не вяжется.
>>1368378 Как ФП может сущевствовать без стейтлесса? На этом же он и основан: функция должна переделывать одни данные в другие, а не изменять состояния и создавать побочные эффекты. В этом же и есть суть - между функциями и данными нет никаких границ, это одно и тоже.
>>1368151 В реальном мире (к счастью или к сожалению) нужна.
>>1368378 10 студентов-байтоебов из 10, лол. А если спуститься еще ниже, то окажется, что как раз никакого стейта нет, одни гейты да датафлоу. У тебя нет такого чувства, что тебя подъебать пытаются? ;) Погугли, что такое "абстракция".
>>1368408 Ты можешь смоделировать твои побочные эффекты так, что при формальном описании языка они будут выглядеть (и вести себя, и описываться) как чистые функции. Тогда ты можешь доказывать о них разные утверждения как о чистых функциях, и ничего не сломается.
>>1368477 >А если спуститься еще ниже, то окажется, что как раз никакого стейта нет, одни гейты да датафлоу Как раз там вполне себе конкретные состояния же, на физическом уровне прям.
>>1368477 >смоделировать твои побочные эффекты так, что при формальном описании языка они будут выглядеть (и вести себя, и описываться) как чистые функции Вот так норм, странно что об этом в обучательных книгах не пишут. Даже в тех, что парадигмы программирования рассматривают не наблюдал такой оговорки.
>>1368477 > Ты можешь смоделировать твои побочные эффекты так, что при формальном описании языка они будут выглядеть (и вести себя, и описываться) как чистые функции. Как это делать? Я пиздос тупой и не понимаю как.
>>1367358 >Ну на деле современный функциональщик (хаскеллист) берёт либу типа mtl или capabilities (если он совсем продвинутый), ебенит монадный стек через трансформеры и дерайвит всевозможные инстансы, чтобы бесплатно получить комбинаторы и их писать. Я вообще не помню, когда бы мне приходилось писать прямо свой оригинальный инстанс монад или аппликативов.
В джаве тоже можно использовать библиотеки и фрэймворки, и особо над собственной реализацией паттеренов особо не заморачиваться
>>1368506 Ну, я не специалист во всех этих сыркуитах, но нет, ты же там коннектишь входы@выходы, нанды в ксоры пихаешь, ну и так далее. На физическом уровне у тебя напряжение, чтобы из него мутабл целл сделать, это надо уже явно ее построить: https://en.wikipedia.org/wiki/Flip-flop_(electronics)
>>1368508 Хз, в любой книжке по сабжу об этом написано. Ты по-моему путаешь моделирование грязноты через манатки или линейные типы и написание логики на чистых функциях
>>1367888 Так нахуя же везде пишут "скачайте платформу, затем cabal install mamuebal zaloopa-14.88", даже без сандбоксов, если это 100% нерабочий вариант? Это юмор какойто или что? Я реально думал, что эти ваши хачкели просто не работоспособны, пока не попробовал stack.
>>1368408 Попробуй мысленно отделять интерфейсы от реализации. На уровне языка (в денотационной семантике) и правда никаких состояний нет. Просто зависимости между данными. Ясное дело, что по факту без стейта жить невозможно, просто им занимается компилятор, а не программист.
>>1369186 Если строго нужна установка пакета кабал в глобальный неймспейс, типо того же идрис, то просмотри в сторону nix. Он позволяет это сделать без геморроя и засорения глобального неймспейса чем-то кроме самого нужного пакета.
>>1369216 Плюсадин. Не знаю, зачем товарищи "академики" везде суют кабал, но Nix - это жизнь. Лучше потратить лишние пару суток на то, чтобы разобраться, но не гадить в систему и не испытывать проблем с зависимостями. Тут, правда, есть подвох, который заключается в отжирании никсом места в долговременной памяти, но если научиться чистить мусор, то и с этим можно жить.
>>1369299 >>1369216 Двачую, сижу на никсосе и пишу хэлловорлды на хацкеле. Правда я хз как запустить hie с вскодом из-под никс-шелла, чтобы он видел сторонние либы.
>>1367888 > скомпилируйте https://github.com/haskell/haskell-ide-engine (stack-ом, Хоспаде, какой ебаный ад этот ваш HIE. Уже с час конпеляется, два разных GHC поставил, причем второй походу из исходников собирает. А не, вроде что-то высрал Copied executables to /home/canterel/.local/bin: - hie - hie-wrapper # stack (for hie-8.4.4) # stack (for hie-8.4.4) Build completed in 35m29s И это еще не все, судя по гайду. Индусам, которые это вымутили, надо настучать хуем по лбу и отправить улицы подметать. Несколько гигов хуеты ради IDE-плагина, ебаный рот этого казино...
>>1369326 он у меня с ним и стоит. Компилировать и запускать свои хелловорлды с либами я могу, а хие кидает ошибку. Мне кажется, у меня в шелле один ghc, а хие использует другой.
>>1368095 Перлюдии больше лет, чем тебе, хуле ты хотел? И я уже писал, что в самой Прелюдии нет ничего криминального, просто есть некоторые грабли, на которые ньюфаги могут наступить, вроде ленивого foldl, ленивого IO, те же String, из названия которых ньюфаг может подумать, что это такой же String, что и в Джаве/Питоне, а потом очень неприятно удивиться производительности своей программы для обработки текста. Причем про всё это написано в документации, но как показывает практика вопросов на Stackoverflow, документацию никто не читает.
Что касается Скалы, то в ней настолько охуенная "стандартная прелюдия", например, библиотека коллекций, что только замена её на более вменяемую дала буст в 25% (https://www.scala-lang.org/blog/2017/02/28/collections-rework.html), причем авторы еще не пользовались специализацией. И при этом она существенно сложнее, со всеми своими CanBuildFrom и <хуйпизда>Like. Для ньюфагов самое оно, да.
>>1368510 >На скале и расте с этим все сильно лучше Вот про тулинг в Скале ты мне не пизди, я с этим языком не первый год работаю. С фронэндом там тоже настолько всё лучше, что в Idea до сих пор не могут запилить провеку синтаксиса, которая не подчёркивала бы красным вполне валидные и компилируемые Скала-выражения. И что-то мне подсказывает, что в поддержку Scala в Idea было ввалено побольше ресурсов, чем в тот же HIE.
>>1368567 https://www.fpcomplete.com/blog/2017/07/iterators-streams-rust-haskell c_cheating там, конечно, победила, но только из-за векторизации, которую в Хаскель не завезли (в Rust, судя по результатам бенчей, тоже). Забавно, что автор неверно предположил, что это из-за конвертации в цикла downward-counting loop. Нет, конвертация downward-counting loop сама по себе такого выигрыша не даст, а вот векторизация примерно так себя и ведёт (учите ассемблер и читайте дампы). Вообще, если ты знаешь, как работает оптимизатор Хаскеля, не так сложно заставить его генерировать что тебе надо. Если ты не знаешь, как работает оптимизатор плюсов, то и на плюсах ты быструю программу хуй напишешь. По сложности они примерно одинаковы.
>>1368796 Так было до появления Стека. >если это 100% нерабочий вариант? Он не на 100% нерабочий. Если ты скачаешь ghc, установишь cabal-install, alex и happy (не знаю, входят ли они в поставку, несколько лет без Стека ничего не собирал), и просто сделаешь cabal install mamuebal zaloopa-14.88, то всё сработает. Проблемы начнутся позже. Дело в том, что не сэндбокснутый cabal генерирует план исходя из того, что у тебя уже установлено в гобоальной базе, обращаясь при этом к нелегальным интернет-казино для генерации случайных чисел. В итоге ты можешь закончить с таким набором пакетов, для которого невозможно удовлетворить констрейнты очередного инсталлируемого пакета. И тебе никто не сможет помочь, потому что у тебя будет свой уникальный набор версий пакетов, зависящий от того, в каком порядке ты их устанавливал. Чтобы таких ситуаций не возникало, придумали Stack - там фиксированный глобальный план, построенный для всех пакетов, включенных в Stackage.
>>1369186 В Агда-курятнике своя атмосфера. Там сидят 3.5 академика, видимо им похуй на проблемы ньюфагов.
>>1369386 Добро пожаловать в мир компилируемых языков. Если бы ты попробовал собрать llvm, или какой-нибудь еще плюсатый-полосатый, получил бы то же самое. >два разных GHC поставил По ходу ты ебанул stack ./install.hs cabal-build-all. Нет, не надо так делать, он тебе установит все версии GHC, придуманные с рождения Саймона Пейтон-Джонса. Запускай только "stack ./install.hs hie-8.4.4". И не надо делать "stack ./install.hs build-doc-8.4.4", документация есть в интернетах, не надо её локально билдить.
>>1369430 >Мне кажется, у меня в шелле один ghc, а хие использует другой. Не ставь ghc отдельно! Только через stack. Запускать через stack ghci, он запустит тот, который у тебя указан в резолвере твоего проекта.
>>1369387 Можно. Если человек в состоянии собрать и настроить хаскельмод для емакса, то это уже не ньюфаг и мои советы ему нахуй не нужны.
>>1369935 Да, но после перехода на Linux у меня лично жопаболи стало меньше. Как я уже писал, GHC 8.6.3 выпустили с поломанный линкером под винду: https://gitlab.haskell.org/ghc/ghc/issues/16057 (правда уже починили, но осадочек остался). Просто вдумайся в это, продукт идёт в релиз с багом на платформе, заявленной как Tier 1 (бла-бла Tier 1 platforms are our top priority. We only release GHC when they all work). Я вообще охуел, для меня это сигнал о наличии какой-то серьёзной методологической проблемы. Остаётся надеяться, что это временная хуйня, связанная с недавним переходом к сокращённым релизным циклам и больше повторений подобных косяков не будет.
>>1370097 >Не ставь ghc отдельно! Только через stack. Запускать через stack ghci, он запустит тот, который у тебя указан в резолвере твоего проекта. Что-то стэк кидается ошибками на моем никсосе, ну нахуй его, буду сидеть с вима через nix-shell. Мб когда-нибудь послушаюсь твоего совета и попробую стэк, но пока мне и nixa хватает.
Почему все функции в хацкеле считаются чистыми? Почему, если функцию обернуть в монаду, то она станет чистой? К примеру, вызовем readFile с одинаковым инпутом, но потом удалим файл. Ведь хоть снаружи результаты этих функций выглядят одинаково Maybe a, внутри они разные Just a | Nothing, значит функция дала разные результаты под одинаковый инпут.
Как я понял, монада это тайпклас, да? А IO и Maybe его реализуют.
>>1370141 >Как я понял, монада это тайпклас, да? А IO и Maybe его реализуют. Да. >Почему, если функцию обернуть в монаду, то она станет чистой? Потому что монадические вычисления следует считать обыкновенными структурами данных. Значение типа IO a - это как бы "список дел", который ты можешь куда-то передать или откуда-то получить. С этой точки зрения, ты просто вычисляешь конечный список дел main чистыми функциями, а потом передаёшь его на исполнение в рантайм.
>>1370097 >Если человек в состоянии собрать и настроить хаскельмод для емакса, то это уже не ньюфаг Если ньюфаг не может прочитать инструкцию и сделать по инструкции, то мне страшно представить, что такое "ньюфаг". Это тот, для кого надо туториалы начинать со слов "включите компьютер"?
А есть чо по ATOM'у? У меня на нем и Идрис и агда работают, а для хаскелля нагуглил какую-то ебань, оно мне весь атом перепердолило и вроде так нормально и не заработало.
>>1370097 >Перлюдии больше лет, чем тебе, хуле ты хотел? Да дело даже не в этом, как мне кажется, а в том, что она изначально для другого делалась.
>замена её на более вменяемую дала буст в 25% Ну давайте еще байтики и миллисекунды считать, ага.
С тем, что они мудаки, что переписывали ее кучу раз, я не спорю (хочешь стабильности(тм) и интерпрайза(с) - юзай кложу, ни одного ломающего изменения за 10 лет ну и в элике думаю тоже норм будет, хотя надо еще подождать-посмотреть, потому что эти языки изначально делались для того, чтобы хуяк-хуяк и динамическая опердень, а не для того, чтобы писать пейперы. сова@глобус)
>>1369599 > ghcid https://github.com/ndmitchell/ghcid Шляпа. >>1369462 > Emacs + haskell-mode А вот это годно. Работает на винде, проверил. >>1370437 > Даже у идриса тулинг лучше, чем у хацкеля Для Идриса в атоме вообще охуеннейшая интеграция + все ставится в несколько кликов мышкой без малейшего пердолинга, при том, что Идрис интересен 3.5 аутистам. А для хачкеля под атом вообще ничего хорошего, при том что на нем полно народу пишет. Парадокс.
Здраститя. Такой вопрос - как одной коммандой загрузить все модули либы или как это правильно назвать? Пример - http://hackage.haskell.org/package/llvm-hs-pure там куча модулей: Modules LLVM LLVM.AST LLVM.AST.AddrSpace LLVM.AST.Attribute LLVM.AST.COMDAT LLVM.AST.CallingConvention бла бла... Вот как их одной коммандой в IDE загрузить? Я к примеру делаю :m LLVM.AST, но функции из других модулей не доступны, пока их так же явно через :m не загрузишь.
>>1370900 > У тебя LLVM.AST предоставляет апишечку к этим конструкторам. Так функции не видны, пока явно не загрузишь модуль, где они прописаны. Я так и подумал, что если LLVM.AST загрузить, типизация всех его подмодулей так же будет доступна. Проверил - хуй там плавал.
Haskell-mode на убунте не работает. Пишет, нет такой программы ghc. И на самом деле, хачкель, поставленный через стек, запускается только через stack ghci. И как быть? Прописывание полного пути до ghc не помогает. На винде все просто работает, а с бубунтой чет борода...
Есть у меня один старый проект на хачкиле, в котором код полное говно. Хочется его зарефакторить красиво. Что можно почитать на тему проектирования и архитектуры?
>>1376687 >Скажите, у функционалки есть будущее или императивка все еще рулит? Функц. Программирование началось еще с 58 года, 4 года после выхода Фортрана. Как видишь, живет, но хуево живет. Будущее есть, но всегда второй эшелон
>>1380248 > Теория типов говно, парадокс Рассела выдуман, а пропозициональной логики достаточно чтобы описать любую формальную символьную систему. Дискасс.
>>1385301 Невозможно создать гибрид самолёта и дилдака. Гибридный ЯП - это как летающий хуй, выглядит смешно, но ни по одному назначений его не применить.
>>1387292 Ты не в том направлении думаешь... В словосочетании "язык программирования" надо деконструировать "программирование", а не "язык". Уася, языковые игры, врубайся.
Пытаюсь реализовать линкед лист, но у меня возникло пара вопросов: 1) Что с производительностью? Хацкиль точно оптимизирует пикрл? код не проверял, но вроде все знают зипперы. 2) Какой есть аналог указателям? Например, я хочу удалить все от элемента А до элемента Б. Пока что приходит в голову только костыль в виде того, что каждый элемент должен быть в паре со своим рандомно сгенереным числом, но разве нет варианта по-проще? бля, какие нахуй указатели в сикуенс, который на бинарных деревьях основан. Хотя, у него сложность "следущего элемента" О(1). Ну а с обычными листами хоть что?
Почему Хаскел, а не Standard ML? Я посмотрел на ML, и мне он показался круче хаскеля. Более простой, более предсказуемый, более чистый язык без лишнего.
>>1370443 >Да дело даже не в этом, как мне кажется, а в том, что она изначально для другого делалась.
Почему для другого? Как раз для того, чтобы предоставить некий дефолтный набор функций. Просто в 95-м Хаскель был PoC, а потом, когда на нём стали писать коммерческие приложения, требования слегка изменились. Так появился RIO.
>Ну давайте еще байтики и миллисекунды считать, ага. Давайте. У меня кластер на 200 машин. Если вывод в прод какой-нибудь хуйни требует докупки ещё 200 машин, байтики и миллисекунды начинают значить.
>>1396164 >Что мы имеем в SML? Производительный компилятор MLton, простой и мощный язык без лишнего, либ может по меньше, но они тоже есть.
>>1396164 >мощнейший академический бэкграунд Что это значит? Вообще то ML предок Хаскеля. Он старше, его исследованиям занималось больше ученых. Можно поспорить где академический бекграунд мощнее. Хотя мне непонятно что ты имел ввиду. Хаскель создавали все же не такие авторитетные личности как в случае с ML.
>>1395872 >более чистый язык Чистый язык - это термин с конкретным значением (язык с чистыми функциями), и в том-то и прикол, что Haskell чистый язык, а SML нет. То есть твой вопрос сводится к "нахуя нужны чистые языки". Ответ на него - нахуй не нужны, но ты ошибся тредом, потому что здесь маньки, которым они зачем-то нужны.
>>1396222 >Чистый язык Я не писал про чистые функции. Контекст смотри. Ты вырвал 2 слова из предложения. Чистый язык без лишнего, то есть не перегруженный фичами как C++. Хаскель как ML, только сверху еще наворочено всякого. Только нужно ли оно. Выглядит как C++ по сравнению с Си.
Мне кажется ты слишком агрессивно все воспринимаешь. Мне нравится минимализм. SML выглядит намного более минималистичным. Вот я спросил, почему Хаскель. Есть конечно такие кому нравится джава и C++, мне это сложно понять
>>1396222 Если кратко, нужна ли вся та лишняя сложность, что есть в Хаскеле, но нет в SML? Вот есть Лиспы, они имеют очень мало фич, но очень гибкие и мощные. Зачем усложнять, теряется же гибкость, появляется ненужная сложность?
>>1396235 >Вот я спросил, почему Хаскель. А я тебе ответил. Функциональщики носятся с чистотой как с отче наш. Если ты захочешь сделать из ML чистый язык, получишь язык чуть лучше хаскеля (потому что хаскель как с++ развивался эволюционно и постепенно копит в себе кучу легаси-говна типа поломанной прелюдии), но между выбором перепиливать тонну легаси с нуля или потерпеть недостатки люди всегда выбирают легаси, вот хаскель и превращается потихоньку в такой легаси-язык. А SML не превращается, потому что на нем никто не пишет. Ведь если тебе достаточно энергичного императивного языка, у тебя появляются другие критерии помимо хорошей системы типов или как ты говоришь минималистичности.
>>1396240 >А SML не превращается, потому что на нем никто не пишет. Не поэтому. А потому что он не развивается так как Хаскель. Последний стандарт 97 года. Хаскель вообще то экспериментальный язык. Он как полигон для испытаний, на нем испытывают новые фичи. Удачные потом Microsoft Research перетаскивает себе. Это на мой взгляд плохо.
На мой взгляд современные тенденции идут не туда куда следует. В языки тащат всякий хлам, но они не становятся мощнее от этого.
>>1396206 >Производительный компилятор MLton Он быстрее GHC? Что-то сомневаюсь, предлагай тесты, сравним. >Вообще то ML предок Хаскеля. Ну да. В Хаскеле учли опыт ML, это просто более современный язык, вобравший в себя лучшие практики функциональщины.
>>1396235 >Хаскель как ML, только сверху еще наворочено всякого. Только нужно ли оно. Выглядит как C++ по сравнению с Си. Ты, похоже, плохо знаешь Хаскель. В том-то и дело, что "сверху еще наворочено всякого" довольно грамотно, так, что добавляемая фича не ломает язык, не конфликтует с другими фичами, зачастую вообще ортогональна другим фичам, а если в чём-то их дублирует, то всегда есть кейсы, когда использование именно этой фичи удобнее аналога.
Да, есть спорные решения. Например, наличие асинхронных исключений и совмещение wait логики c resource acquisition. В итоге мы имеем mask и uninterruptibleMask, это пиздец как сложно, но, в итоге, осилили же, теперь есть https://www.stackage.org/package/unliftio и можно просто писать код, который будет работать. Стоило ли оно того - х.з. Но мне, как программисту, весьма удобно, что в языке есть рабочий механизм асинхронных исключений и либа, позволяющая корректно совмещать асинхронные исключения и управление ресурсами. Да, они изрядно поебались чтобы сделать это правильно, зато я теперь не ебусь.
Другой пример - это выбор MVar в качестве примитива синхронизации. На мой взгляд, можно было бы взять IVAr и AtomicRef в качестве примитивов, и уже через них выразить MVar, как это делают некоторые любители Cats на Скале (тем более, MVar в 90% случаев не нужен и опасен). Ну когда в data-ivar операции над IVar (более простой структурой) выражают через MVar (более сложную), это, как минимум, странно выглядит. С другой стороны, я не системный программист и не могу сказать, какой оверхед по производительности будет в случае конструирования мьютекса из IVAr-а и AtomicRef-а (как это делают кошкоёбы, которым, по сути, похуй на производительность, кошки изначально сливают Хаскелю на порядки). Возможно, он будет существенным и запил MVar-ов был оправданным.
Но, в целом, мы видим очень грамотный дизайн языка. На вопросы "что поменять?", "что выкинуть?", "какая фича мешает?", "как сделать это лучше?" практически никогда нельзя ответить, потому что всё сделано настолько хорошо, насколько это вообще возможно в реальном языке программирования.
>>1396240 >Функциональщики носятся с чистотой как с отче наш. Не зря носятся. Есть два столпа функционального программирования. Это ссылочная прозрачность и наличие оптимизации хвостовых вызовов. Если этого нет, ты просто не построишь нормальный функциональный язык, позволяющий полноценно применять функциональные паттерны и получать на выходе производительный код. Всякие мультипарадигмы и попытки эмулировать функциональщину в языках без ссылочной прозрачности и на платформах, не поддерживающих TCO, потому и сосут, что там нет этой основы.
Вот возьми ту же Скалу, что с ней не так? Система типов хуёвая? Да нет, многое, что есть в Хаскеле, в Скале прекрасно эмулируется, на тот же Cats и ZIO посмотри. Но всё это, сука, неюзабельно, неудобно, тормозит, требует кучу костылей для применения на практике и все эти костыли полностью нивелируют преимущества функционального подхода. Программируя на Скале в функциональном стиле ты, буквально, воюешь с собственным инструментом, а не используешь его преимущества.
В итоге мы получаем: "If scala was the only language I had to think in, I'd think functional programming was a bad idea that didn't scale, too." А разгадка проста: отсутствие TCO и ссылочной прозрачности просто не позволяют создать язык, допускающий использование функциональных паттернов без костылей и ебли.
>>1397331 >это просто более современный язык, вобравший в себя лучшие практики функциональщины 100500 ненужной шелухи
>>1397331 >оптимизации хвостовых вызовов. Это можно запилить с помощью трамплинов и другими способами.
>>1397331 >Всякие мультипарадигмы и попытки эмулировать функциональщину в языках без ссылочной прозрачности и на платформах, не поддерживающих TCO, потому и сосут, что там нет этой основы. Ой, да неужели. А F# и не знал.
>>1397331 >ссылочная прозрачность В любом языке это есть, даже в нефункциональных. Везде можно писать чистые функции.
>>1397390 >Думаю да. А я думаю, нет. Поэтому и говорю, предлагай бенч, в которомы ты думаешь OCaml будет быстрее и мы проверим. >100500 ненужной шелухи Думаю тебе не составит труда привести пару примеров. >Это можно запилить с помощью трамплинов Ну в Скале так и делают. В итоге в "If scala was the only language I had to think in, I'd think functional programming was a bad idea that didn't scale, too." >А F# и не знал. А F# сосёт, там даже еще печальнее, чем в Скале дела обстоят. > Везде можно писать чистые функции. Ссылочная прозрачность - это не "можно писать чистые функции".
Вообще, сдаётся мне, что у тебя просто нет опыта работы с ФЯ, просто какие-то отрывочные знания и большо желание поспорить.
>>1398258 Манямирок тут только у школоты, которая нихуя ни знает ни Хаскеля, ни Скалы, ни F#, не использовала эти языки в продакшене, не писала на них сколь угодно производительного кода, не разбирается в том, как устроены ФЯ, но зато очень хочет поспорить.
>>1398324 >предлагай бенч, в которомы ты думаешь OCaml будет быстрее Не OCaml, MLton. Это реализация SML.
>>1398324 >Думаю тебе не составит труда привести пару примеров. Особо Хаскель не знаю, да и давно его видел. Он же отличается от SML? Вот чем отличается то я и имею ввиду. Мне это кажется лишним. Нравятся минималистичные языки.
>>1398324 >Ссылочная прозрачность - это не "можно писать чистые функции". Что это тогда? Это же свойство чистых функций.
>>1398324 >Вообще, сдаётся мне, что у тебя просто нет опыта работы с ФЯ, просто какие-то отрывочные знания и большо желание поспорить. Если по твоему я спорю, то и ты тоже. Ты спросил я ответил. Может ты и писал больше меня, хотя этого я точно не знаю, но это не означает что все твои слова правильные. Типа ты безошибочный и все знаешь?
>>1398324 Stack в Хаскеле не понравился. Мощный конечно, но переусложненный, пока научишься им пользоваться уже Хаскеля не захочется. Мне нравятся удобные инструменты. Мощность, многофункциональность приносит лишнюю сложность.
>>1398330 >Когда её добавят в новый lts? Никогда. Агдаёбам похуй.
>Как это вообще делается? Берёшь и добавляешь Агду в https://github.com/commercialhaskell/stackage/blob/master/build-constraints.yaml указав себя в качестве мейнтейнера. Но после этого, если Агда вдруг не собирается в текущем плане, тебе будут сыпать емайлы с просьбой поправить зависимости. А так как ты сам её не мейнтейнишь, тебе придётся делать форк, править зависимости, делать пул-реквест и писать: "дорогие мои агдаёбы, пожалуйста примите мой пул-реквест и залейте новую версию на хакадж!"
Вообще, чужие пакеты мейнтейнить - дело неблагодарное. Если самим агдоёбам похуй - пусть идут лесом. Но если ты вдруг внезапно угорел по Агде, готов её как-то там развивать и тратить на неё время, советую снача стать официальным мейнтейнером самой Агды, с правом хуярить в их master и выкатывать релизы. После этого ты можешь добавить её в stackage, и если там вдруг что-то не будет собираться, ты сможешь сам поправить зависимости и сам выкатить новую версию.
>>1398518 >Не OCaml, MLton. Это реализация SML. Ну т.е. ты предполагаешь, что SML может обскакать GHC, но на каких примерах ты не знаешь. Что ж, смелая гипотеза, учитывая, сколько человеколет въебашили в GHC. Мне самому было бы интересно на это посмотреть, поэтому и спросил за бенч. Но раз нет, так нет.
>Особо Хаскель не знаю Но в нём 100500 лишней шелухи. Охуеть. Я сейчас напишу, что в SML много лишней шелухи по сравнению с Хаскелем. Я ведь на SML ни строчки не написал, но SML отличается от Хаскеля, значит там 100500 лишней шелухи. Ты ебанутый?
>По каким это параметрам? По возможности реализации функциоанльных паттернов программирования. Если Scala позволяет их хотя-бы как-то эмулировать (хотя это не очень полезно на практике, ведь мало запилить какую-нибудь монаду, надо еще чтобы она работала не сильно медленнее аналогичного кода в императивном стиле, иначе она нахуй не нужна в продакшене), то F# тупо не позволяет всё это делать. Там тупо нет higher-rank polymorphism. Т.е. если в Скале можно делать какое-то подобие абстракции контекста исполнения (скалаёбы называют это tagless final), то в F# гвоздями прибитые к .net дженерики и очень частная попытка в computation expressions. Авторы F# так и заявили "мы не будем это делать, потому что платформа .net это не поддерживать а ручками мы это делать не хотим" лень гуглить, но если ты мне не веришь, могу постараться
>Экосистема у него круче намного. Ой да в пизду, какая там экосистема?
>Что это тогда? Это возможность заменять выражение его значением и наоборот без изменения семантики программы. Это важно для оптимизации функционального кода. Потому что в функциоальной программе объявляется много промежуточных структур данных используются всякие паттен-матчинги, и если нет ссылочной прозрачности, то всё это говно надо реально реифицировать. А если ссылочная прозрачность есть, это открывает множество возможностей дефорестации, stream fusion и т.п. Хаскель это активно эксплуатирует, причем на уровне компилятора, поэтому на нём можно просто писать в функциональном стиле. В Scala/F# любой биндинг в монадке - это создание замыкания, реального объекта в run-time + indirect call. Соответсвенно, у функцильональщиков, которые пишут на Scala/F#, возникает резонный вопрос: а нахуй вообще нужно функциональное программирование, если в реальном коде нужно забыть про все эти плюшки и писать как на старой доброй джаве/сишке? Ну да, на Скале можно побаловаться cats/scalaz, но именно что побаловаться, потому что такой подход будет заведомо проигрывать по производительности императивному коду на том же языке, следовательно не позволит использовать преимущества ФП.
>>1398523 >Stack в Хаскеле не понравился. Мощный конечно, но переусложненный Заведи козу Maven-а покушай, или sbt. Как накушаешься, возвращайся к stack.
>>1398527 >А нахуй f# нужен? Испытательный полигон для C#. Сначала фишки проверяют на более динамичном F#, который не в мейнстриме, где не надо флюродросить энтерпрайзу обратной совместимостью и где более квалифицированные программисты если что будут более аргументированно закидывать говном. Потом, если проканало, вводят фишки в C#. Больше он нахуй ни для чего не нужен.
>>1398711 Ты ебанулся, какие нахуй "автоматические", если в Агде ты доказываешь всё конструктивно, буквально расписав каждую теорему на шаги как складывать натуральные числа. Агда нихуя не доказывает автоматически, она лишь проверяет, что предложенная тобой схема доказательства в её системе типов тайпчекается за конечное кол-во шагов.
>>1398759 >ты предполагаешь, что SML может обскакать GHC Да. Не думаю скорость визитная карточка Хаскеля.
>>1398759 >было бы интересно на это посмотреть, поэтому и спросил за бенч Попугли ёпт, раз интересно.
>>1398759 >SML отличается от Хаскеля Большей минималистичностью
>>1398759 >По возможности реализации функциоанльных паттернов программирования. А ты на нем писал чтобы такое утверждать?
>>1398759 >Ой да в пизду, какая там экосистема? Намного круче Хаскелевой. Новая платформа NET Core от MS. Быстрый рантайм, обходит по производительности джаву. В некоторых бенчах приближается к Си. Куча библиотек, модульный веб-фреймворк который быстрее Netty, возможность компиляции в нативный код.
Кроме того для NET Core есть крутые фреймворки и либы не от MS. Websharper о котором я уже писал, и еще куча всего.
Можно юзать F# без дотнета. Есть отдельная реализация, и для нее тоже есть полная экосистема, несколько веб-фреймворков и куча либ с инструментами.
>>1398759 >Это возможность заменять выражение его значением и наоборот без изменения семантики программы. Кек, так это же и есть чистая функция, которая зависит только от аргументов и не модифицирует нигде состояние. По моему ты морочишь мне голову.
>>1398759 >у функцильональщиков, которые пишут на Scala/F#, возникает резонный вопрос: а нахуй вообще нужно функциональное программирование, если в реальном коде нужно забыть про все эти плюшки и писать как на старой доброй джаве/сишке? Шта? На F# невозможно писать как на джаве/сишарп, это ML ёпты.
>>1398759 >Ну да, на Скале можно побаловаться cats/scalaz, но именно что побаловаться, потому что такой подход будет заведомо проигрывать по производительности императивному коду на том же языке, следовательно не позволит использовать преимущества ФП. Естественно ты не измерял. Тогда и пиши что это только твое мнение, как и я написал. Кстати я думаю Скала на JVM обойдет Хаскель во многих тестах.
И вообще, что за мантра "не позволяет использовать фишки ФП"? Что не позволяет? Какие фишки не позволяет? Почему не позволяет?
>>1398759 >Заведи козу Maven-а покушай, или sbt. Как накушаешься, возвращайся к stack. Я вообще на Скале не писал никогда, да и JVM не использую. Для F# есть dotnet CLI, простая и мощная тулза.
>>1398759 >Испытательный полигон для C#. Ну не правда же. Испытательный полигон для C# - Хаскель. Вся верхушка команды разрабатывающей Хаскель работает в Майкрософт ресерч, включая Э. Мейера, С. Пейтон-Джонса, и других.
F# если что не принадлежит MS. Есть некомерческая организация Fsharp Software Foundation которая занимается его развитием. Проект открытый, лежит на гитхабе, развивается сообществом.
>>1398329 >Манямирок тут только у школоты, которая нихуя ни знает ни Хаскеля, ни Скалы, ни F#, не использовала эти языки в продакшене, не писала на них сколь угодно производительного кода, не разбирается в том, как устроены ФЯ, но зато очень хочет поспорить.
Я, короче, вообще нихуя не понял. В стекедже агды нет. А на гитхабе у них нашел вот такое https://github.com/agda/agda/blob/master/stack-8.6.5.yaml Т.е. я что, могу просто это скочать и потом запустить stack build и оно соберется с использованием крайнего резолвера 13.21?
>>1398793 Ну, это и есть автоматическое доказательство, программа берет на себя рутинную работу по проверке верности построения формальной системы. За тебя она, конечно, придумывать доказательство не будет, искусственный интеллект еще не завезли.
>>1399254 >Как именно не ставится? git clone, затем stack init. Пишет, что резолверы не подходят. >Есть как минимум 3 варианта установки. Огласите весь список >>1399256 >Какая ОС у тебя? В арче/манжаро например агда есть в репах. Бубунта 16.04. В репах агда старая поди, я хотел 2.6. Версия 2.5.4.2 (предпоследняя) через стек норм ставится, оно у меня и стоит. А 2.6 в стакадже нету.
>>1399244 Я не пишу на Хаскеле сразу говорю, поэтому некоторые вещи не знаю. Почему тебе нужен именно stackage если ты можешь поставить из hackage последний релиз с помощью cabal? Почему не поставить в виде пакета? Почему не собрать самому в конце концов?
>>1399261 >>1399264 Стек - единтсвенный рабочий вариант, все остальное либо совсем не ставится, либо ЧАСТИЧНЫЙ УСПЕХ с засиранием винта гигабайтами мусора, который потом еще и чистить вилкой...
>>1399265 >все остальное либо совсем не ставится, либо ЧАСТИЧНЫЙ УСПЕХ с засиранием винта гигабайтами мусора, который потом еще и чистить вилкой... Привыкай. Тут как бы 2 варианта, либо ставишь, чистишь, дебажишь, либо используешь докер/виртуалки.
>>1399268 Я ж не мейнтейнер агды, надобавляю там... Я ее просто из исходников собрать не могу. >>1399270 Стек работает без бубна, когда в стакадже пакет есть. Через лтс 12.26 без дрочьбы вприсядку и без единого косяка ставится и работает хаскель, агда, идрис + собираются проекты. Я такого вообще не встречал.
>>1399274 >Я ж не мейнтейнер агды, надобавляю там... Научишься, опыт получишь. По другому никак. Нужно пробовать.
>>1399274 >Я ее просто из исходников собрать не могу. Опиши что не получается.
>>1399274 >Стек работает без бубна, когда в стакадже пакет есть. Вот именно что "когда". Не всегда пакеты будут, будут баги вылезать, это нормально, так везде. Так что лучше не ждать пока кто то соизволит добавить, а научиться самому.
>>1399274 >Я такого вообще не встречал. Еще встретишь и не раз. Я тебе посоветовал кабал, это самый простой для тебя вариант. Еще вариант перейти на арч/манджаро, в их репах всегда все свежее.
>>1399274 Есть еще сексуальный вариант. Установить linuxbrew, и с помощью него поставить агду. Он использует пакетную базу homebrew, а там всегда все свежее.
>>1399488 Лол, я тоже не заметил. Удивился что картинка такого же размера и код очень похож, но не подумал что это та же самая.
FP is dead as a topic.Аноним14/05/19 Втр 11:44:41#395№1399611
>>1396243 Помните, было такое "структурное программирование"? Люди в чатиках конца шестидесятых срались на тему СП vs. GoTo, кричали "considered harmful!", писали посты на своих печатных машинках, такая движуха была. И где оно все, почему прекратились срачи? Все основные языки впитали в себя (или взросли на) СП, и тема рассосалась. Наблюдая за интенсивностью тем об ФП на разных форумах, в ЖЖ, в журнале ПФП и прочих интернетах, в этом году могу констатировать аналогичную ситуацию: ФП как темы больше нет, расходимся. Все основные языки впитали в себя (или взросли на) ФП, по крайней мере полезные его части (первоклассные функции, ФВП, лямбды, замыкания, иммутабельность, произведение типов, копроизведение типов, экспонента, применение этого всего в первую очередь в виде map/filter/reduce), а бесполезные части оказались выкинуты на задворки, в уголке музея эзотерики на них всегда можно будет полюбоваться, но в основном только там. Думаете, другая часть ФП еще себя покажет, и расширение линз Кана вправо-вверх вдоль контравариантного функтора еще выстрелит? Не будет этого, dead end.
>>1399611 Ну правильно, скрестили бульдога с носорогом, и получилось чудовище. Посмотри на C#, один из самых мультипарадигменных, но это же полный отстой, страшное поделие псевдоинженеров. Стопятсот ключевых слов и фич, а код ни разу не компактный. ФП как и математика будет жить всегда, и тру-фп языки тоже никуда не денутся. За последние лет 5 русскоязычное компьюнити фп языков значительно расширилось. Вакансий тоже стало больше. Раньше про Хаскель тупо не слышали. Сейчас же любой вкатывальщик в программинг хоть краем ухо о нем слышал.
Уйня эти ваши языки-мутанты. На них невозможно написать легко поддерживаемый код. Их участь писать говно - выбрасывать - снова писать говно - снова выбрасывать.
>>1399212 >Ну, это и есть автоматическое доказательство Это автоматическая проверка доказательства, которую почему-то называют "автоматическим доказательством".
>>1399611 ФП - это когда иммутабельность по умолчанию. У Димона просто манатка головного мозга, а манатки и вправду никому нахуй ненужны, это просто была интересная тема для пейперов с 90-ых, привет.
>>1398793 >>1399631 Нет, это именно автоматическое доказательство. Ты просто не знаешь в чем разница между нотациями "x : A" и "a : A", т.е между гипотетическим и категорическим суждениями в MLTT. То, что в общем случае эта задача неразрешима (теорема о неполноте) никак не опровергает того, что она разрешима во многих частных случаях. Ну а в случае задач, сводящихся к исчислению пропозишенов, все разрешимо полностью автоматически например стандартными тактиками в коке (теорема о полноте).
>>1399771 >ФП - это когда иммутабельность по умолчанию Не совмещается с моделью памяти современных компьютеров, поэтому не нужно. Борщехлёбы, конечно, будут кукарекать, как у них компилятор всё за них делает, но на практике у них обычный квиксорт превращается в хтоническую еботу. Без возможности явно модифицировать данные in place о производительности на современных архитектурах можно забыть, так что удел борщехлёбов - скриптовые язычки вроде js, пусть там пробуют вводить свою иммутабельность.
>>1400267 Не понимаю этих высеров в ФП. Императивщики пытаются реализовать императивные алгоритмы используя иммутабельные структуры в иммутабельном языке, а потом удивляются, хули оно работает через жопу. И архитектура памяти, процессора тут ни при чем. Просто ФП посылает нахуй одну из фич? современной архитектуры - мутабельность, кототрую используют в 95% созданых алгоритмов и структур данных. https://en.wikipedia.org/wiki/Purely_functional_data_structure
>>1400267 Память это всего лишь абстракция из переключателей вкл. или выкл., 0 или 1.
Программисты на высокоуровневых языках не работают с памятью на самом низком уровне, где нули и единицы, это неудобно. Поэтому языки предоставляют другие абстракции поверх памяти, с которыми удобнее работать. В любом высокоуровневом языке они есть.
Если все построено на наложении уровней абстраций, то нет причин не создавать удобные абстрации для ФП языков. Они используют модель вычислений без изменяемого состояния. В них нет изменяемых переменных. Поэтому им не нужны изменяемые ячейки памяти. Компиляторы/интерпретаторы дают им неизменяемые данные.
Никто не может сказать что неизменяемые данные дают сколь нибудь ощутимый оверхед. ФП языки в среднем не медленее императивных языков, а скорее быстрее Если взять топ 10 императивных языков, вывести среднее значение их скорости выполнения, и сравнить со средним значением топ 10 ФП языков, то на мой взгляд ФП языки окажется более производительными. Из императивных языков лидеры по скорости C/C++ и Фортран. Но остальные языки уступают по скорости большинству ФП языков.
ФП языки легко параллелятся. В том числе за счет неизменяемых данных. Парадигма работы с неизменяемыми данными отнюдь не странная и не новая. Она пришла из математики. В математике это естественно иметь неизменные переменные. Наоброт, модель машины Тьюринга кажется странной. Она противоречит философии вычислений в математике.
>>1400267 >о производительности на современных архитектурах можно забыть Это высказывание на уровне "ко-ко-ко кудах-кудах". Уже давно доказано, что ФП языки могут быть наравне с C/C++ по скорости. Иногда даже быстрее. Они точо также оптимизуются. Оверхеда практически никакого. Если небольшой и присутствует, то больше по использованию памяти. Большинство императивных языков даже близко не могут похвастать произодительстью Haskell, OCaml, Common Lisp, и других ФП языков.
>>1400473 >Память это всего лишь абстракция из переключателей вкл. или выкл., 0 или 1. Типичный уровень знаний ФП-петушка >ФП языки легко параллелятся. Как там в 1998? Вс >Она пришла из математики. В математике это естественно иметь неизменные переменные. Только математики при этом любят скриптовые императивные языки
>>1400561 >Только математики при этом любят скриптовые императивные языки
>математики знают, что их операции над объектами не меняют объектов (Вычисление |21/2| не меняет числа 2). Эта неизменяемость является основным отличием мира математики и мира компьютерных вычислений.
Это цитата из книги Бертрана Мейера по ООП. В конце неправильно написано. Математика отличается не от мира компьютерных вычислений, а от мира императивного программирования. В функциональном программироании используют такой же подход как в математике.
Ну и что ты теперь скажешь? Даже один из авторитетнейших людей в мире ООП подтверждает, что императивный подход ущербен. Математика основа вычислений. А императивное программирование ей противоречит. Поэтому оно не нужно.
>>1400806 >Поэтому оно не нужно. Вот тут ты не прав. Возможно фп это круто, когда ты строишь огромную расширяемую систему, но в системном программировании, игорях, хайлоад местах без императивщины не обойтись.
>>1400866 Объясни, насколько нужно быть тупым, чтобы в качестве ответа на аргумент "Только математики при этом любят скриптовые императивные языки " нести phd по cs?
Я тебе расскажу, в чем секрет. ФП - это такой карго-культ программистишек. Которые хотели бы быть математиками, а в итоге приходится лепить круды с нескучными языками программирования.
>>1400907 Императивные языки противоречат принципам математики. Как математики могут любить императивное программирование? У тебя логика сломалась. Хотя ее изначаль не видно было.
Я когда увидел первый раз код на языке программирования, меня стошнило. Естественно это был императивный код. Меня убило то что переменные переприсвают. Мутируют их зачем то по сто раз. Для меня это было чуждо, ведь на уроках математики меня учили работать с пермеными по другому.
Никакой здравый математик не будет писать на императивных языках. Хотя на некоторых императивных языках можно писать вполне функционально, декларативно, и компактно. ES6 в этом плане хорош.
>>1400916 > Императивные языки противоречат принципам математики. Ну вообще не факт. Они вполне соответствуют универсальной машине Тьюринга (абстрактный вычислитель, вполне математика), термин "тьюринг-полноты" никто не отменял. Функциональные же языки соответствуют лямбда исчислению. А так как и машина Тьюринга, и лямбда исчисление, и алгорифмы Маркова это равнообьемные теории (одно выразимо через другое), то противостояние "функциональные языки против императивных" высосано из хуя. Это разный подход к одному и тому же явлению, разница только в практическом удобстве использования тех или иных особенностей.
>>1400969 >Они вполне соответствуют универсальной машине Тьюринга (абстрактный вычислитель, вполне математика) Противоестественная для математики модель. Вот Лямбда-исчисление это математика.
>>1400969 >термин "тьюринг-полноты" никто не отменял И что?
>>1400969 >А так как и машина Тьюринга, и лямбда исчисление, и алгорифмы Маркова это равнообьемные теории (одно выразимо через другое), то противостояние "функциональные языки против императивных" высосано из хуя. Они хоть и равносильны, но совершенно разные. Лямбда-исчисление позволяет строить мощнейшие абстракции из небольшого количества компонентов. Машина Тьюринга может только чиселки складывать. Она тупая и ограниченная. Чтобы с ее помощью создать более менее пригодный язык программирования, нужно сильно изъебнутся, нужны огромные трудозатраты. Лямбда-исчисление позволяет легко и просто создать язык программирования, она сама фактически расширяемый язык программирования.
>>1400983 > Противоестественная для математики модель. Вот Лямбда-исчисление это математика. > Они хоть и равносильны, но совершенно разные. Ещё сам Тьюринг доказал, что на МТ вычисимы ровно те же функции, которые представимы в лямбда исчислении. > Лямбда-исчисление позволяет строить мощнейшие абстракции из небольшого количества компонентов. Машина Тьюринга может только чиселки складывать. Она тупая и ограниченная. Ну здраститя. Даже в самой работе Тьюринга "on computable numbers" полно примеров работы не с чиселками, а с любым конечным алфавитом и любыми действиями над знаками и знакосочетаниями алфавитов. МТ очень крутая вещь, если не ограничиваться простейшим применением типа перестановки нулей и единиц. По факту любой интерпретатор любого императивного яп это и есть машина Тьюринга. Даже в своей простейшей форме с нулями и единицами её достаточно чтобы например, работать с логическими вентилями, т.е для представления любого процессора фоннеймановской архитектуры. Конечно, с практической стороны это бесполезная ебля на ровном месте, но самой возможности это не отменяет.
>>1401041 >полно примеров работы не с чиселками, а с любым конечным алфавитом и любыми действиями над знаками и знакосочетаниями алфавитов Их сначал нужно создать, закодировать. Для этого нужно дохрена времени и сил. Модель не математическая, плохо поддается абстрагированию.
В Лямбда-исчислении за пару часов дней можно закодить начальную поддержку символов, чисел, операций над ними.
>>1401041 >Даже в своей простейшей форме с нулями и единицами её достаточно чтобы например, работать с логическими вентилями, т.е для представления любого процессора фоннеймановской архитектуры. Писец достижение. Как я и говорил это складывание чиселок. Математики не работают на таких уровнях. Это ограниченный уровень глупой машины. Для программирования нужны более высокие абстракции. А чтобы это закодить на МТ, нужно очень много трудозатрат.
>>1401041 Вот зачем ты споришь. Посмотри на ассемблер. Он же почти полный эквивалент языка МТ. Привожу скрин решения задачи A + B на NASM.
WHAT? Вот это и есть сила абстракций МТ? Чтобы сложить 2 числа нужно написать кода на один экран. Это провал. В Лямбда-исчислении таким количеством кода можно выполнить сложнейшие операции.
>>1400473 >Поэтому языки предоставляют другие абстракции поверх памяти, Сразу видно человека, который никогда не спускался в самый низ, хотя бы до АЛУ. Абстракции поверх памяти. Дальше уже не хватило сил читать.
>>1401108 Сразу видно человека который не умеет в абстрагирование. В высокоуровневых языках нет управления памятью на низком уровне. Программисту даже не нужно знать как память работает на низком уровне, чтоб писать на высокоуровневых языках. Всю работу по выделению и освобождению памяти за него делает языковая платформа. Это и есть абстракция над памятью.
>>1401121 Ты когда используешь функцию из библиотеки, ты знаешь как она устроена внутри? Не знаешь. И тебе это не нужно знать. Тебе дается API (интерфейс), с помощью которого ты пользуешься либой, внутреннюю реализацию знать не обязательно чтобы пользоваться. Точно также пользователю высокоуровнего языка не обязательно знать как работает память на низком уровне. Ему дается API его уровня, для решения задач его уровня. А что на низком уровне знать необязательно.
>>1401161 >Знаю. Что ты знаешь? Изучаешь весь код внутри? Ты че ебнутый? Там может быть 100k строк кода. Нихера ты не знаешь внутреннее устройство, ты подключаешь либу и пользуешься. Еще блять скажи, что код компилятора читаешь прежде чем начать им пользоваться, или код ОС прежде чем ее установить.
Откуда вы беретесь такие, еще и в Хаскель треде? Уебывать нужно отсюда, помойка редкостная.
>>1401176 >Что ты знаешь? Изучаешь весь код внутри? Ты че ебнутый? Да. >100k строк кода. Это совсем мало если ты не умственно отсталый хаскельдебил с двощепараши, конечно >код компилятора читаешь прежде чем начать им пользоваться Иногда.
>>1402343 тогда нахуй он нужен? хотя такая же проблема и в сярпах есть - там строка - это массив и функция "складывания" двух строк возвращает новый массив
Поясните за foldr/foldl. Стоит ли юзать их вместо рекурсии? Например для реализации функции elem?
Я вижу здесь несколько проблем. Во-первых, foldr/l проходит по всему списку (что не очень оптимально). Во-вторых, (из-за первого) не получится эту функцию применить к бесконечным спискам.
Или есть какой-то хитрый способ избежать этих проблем? Можно ли как-то заставить fold остановиться при достижении какого-то условия?
>>1403559 Хаскель - ленивый язык, он ничего вычислять не будет, пока это не понадобится (например, чтобы вывести на экран). Когда ты пишешь x = [1..] не считается нихуя. Когда ты пишешь print $ x !! 5, вычислится 1, 2, 3, 4, 5, 6, а дальше в списке будет лежать санк который будет вычислять хвост списка, если потребуется. Соответственно появляется целый новый слой мозгоебли - как сделать ленивое энергичным, а энергичное ленивым.
>>1403568 >>1403576 Не, про ленивость мне более-менее понятно. Непонятно, как это работает в этом конкретном случае.
Я думал, что foldr проходит список, начиная с самого правого элемента, но список-то бесконечный! Самое интересное, что с foldr эта функция работает, а с foldl не работает.
То есть получается компилятор строит такую последовательность (λ — это функция, которая передаётся в foldr/l):
То есть myelem 3 [1..], написанный на foldr будет работать так: 1 λ (…) = 2 λ (…) = 3 λ (…) = True а написанный на foldl будет работать так: ((False λ 1) … ) = ((False λ 2) … ) = ((False λ 3) … ) = (True λ 4) …
Правильно ли я понимаю всё это? И правильно ли я понимаю, что работа foldr с бесконечным списком возможна как раз из-за non-strict semantics? И если бы функция, которая передаётся foldr не допускала бы этой семантики, то и вычисления никогда бы не остановились?
>>1404254 Так и есть, анон! Обязательно прочитаю. Я сейчас читаю Learn You a Haskell for Great Good. Там есть раздел про свёртки, но про их реализацию как-то не очень хорошо написано. Сейчас вроде понял, как это всё работает.
И правая, и левая свёртки идут по списку с самого начала: 1 λ (2 λ (3 λ ( … ))) ((((False λ 1) λ 2) λ 3) … )
Но для правой свёртки это конец вычислений, поэтому засчёт ленивости на каком-то шаге отпадает необходимость в дальнейших вычислениях. И можно сразу вернуть результат. А для левой свёртки такая штука уже не сработает. Всё правильно?
Работаю юристом но хочу вкатится в ит так как мало сейчас платят. Мне посоветовали начать с хаскеля, но что учить потом после него? И какие зп у хаскел?
>>1407627 После Хаскеля учи Coq и гомотопическую теорию типов. З.п. примерно как у топовых джавистов, но работа менее блевотная. Если ты юрист, рассмотри Утрехтский университет права, они там как раз используют Хаскель для валидации законов (не в самом универе, а в коммерческих конторах, которые вокруг него работают, тоже в Утрехте).
>>1407663 >Зумеры открывают для себя хаскель-троллинг Тащем-то достаточно взглянуть на список спонсоров и докладчиков: https://www.fpure.events/#speakers Tinkoff, Сбербанк, Jetbrains, BIOCAD, WAVES, elama, ЭВОТОР, Provectus. Охуенно хаскельцом троллонули, кого забыли пригласить, наверное, Касперского, Luxoft и Яндекс?
Вы, блядь, понимаете, что эти ваши "борщехлёбы" уже везде, и это не вовсе не студенты, а дядьки, которым за 30 и которые работают на должностях тимлидов и руководителей проектов в топовых российских компаниях. И на следующем собеседовании вас спросят вовсе не за паттерны, а за симметричные моноидальные категории. И это отсталая рашка, by the way, за рубежом всё, что напиздели в этой конференции - просто образовательный минимум, кто в него не может, идёт на welfare.
>>1407669 >Тащем-то достаточно взглянуть на список спонсоров Распильные банки, блокчейн-стартапы, коррупционеры, и так далее. Ну и Jetbrains, которым выгодно, чтобы в мире был миллиард языков и для каждого IDE. Хочешь понять, какой язык чего стоит, ищи тех, кто вкладывает свои бабки. Не жрет халявные корпоративные ресурсы, не разводит инвесторов умными словами, а вкладывает свои, рассчитывая отбить. Ну и делай выводы, лал.
>>1407864 Выводы очень простые: на следующем собеседование тебе "перезвонят", когда выяснится, что ты не знаешь, чем симметричная моноидальная категория отличается от декартовой.
Господа хаскеллиты, с меня требуют написать функцию, которая принимает аргументом инт-число и выдает, является ли данное число простым - труе-фолс. Вообще не ебу как это делать. Накидайте, плокс, как это могло бы выглядеть, на что стоит обратить внимание? Естественно, готовому коду тоже был бы рад, но на этом не настаиваю
Ух бля, зашёл в тред сказать, что я отчисленец, который был на паре пар по haskell и мутили хуйню на F#, мне понравилось ФП, и хотел бы узнать что читать. А в результате прочитал весь тред, у меня аж обои от стен поотклеивались. Ух, бля...
>>1403739 >foldr проходит список, начиная с самого правого элемента, Свертка справа означает, что у сворачивающей функции первым аргументом (слева) передается текущее вынутое из контейнера значение, а вторым аргументом (правым) передается оставшаяся свертка. С левой сверткой наоборот.
>>1344026 Двачую. Сначала такие кококо кукареку мы функциональщики, а потом впилили императивные монады, чтобы язык нашёл прикладное применение. Лисперы хоть молодцы, не прогинаются, и похуй им, что 3.5 анонимуса на их языке пишут.
>>1409649 >императивные монады Лол кек чебурек. >Лисперы хоть молодцы История Лиспа очень забавна. Маккартни придумал абстрактные синтаксические деревья и способ их представления в компьютере. А лисперы решили, что это синтаксис языка такой и начали на нём программируют. Так с тех пор и программируют на абстрактных синтаксических деревьях.
Такой вопрос, товарищи. Есть множество кортежей (Int, Int) что есмь клетки. Как сие лучше отрисовать через OpenGL? Я совсем зеленый и ничего в этой графике не понимаю.
Ебать пацаны, я тут узнал, что список МОНАДА! Поэтому это не монада массив, а массив монада. мимо еблан, который уже пол года учит хацкиль по часу в месяц
сап господа функцианальщики. есть вопрос, собсна: возможно ли вычислить через хвостовую рекурсию отрицательную последовательность чисел фибоначчи? если да то как?
Читаю сабж в оппосте. "One big difference is that right folds work on infinite lists, whereas left ones don't! To put it plainly, if you take an infinite list at some point and you fold it up from the right, you'll eventually reach the beginning of the list. However, if you take an infinite list at a point and you try to fold it up from the left, you'll never reach an end!" Нихуя не понял, можете мне объяснить?
Они там выше еще поясняют что foldl бегает слева направо, а foldr бегает справа налево, как это проверить? Хуи со стековерфлоу пиздят что все бегают слева направо, я вахуе братишки. Не могу понять как это на самом деле работает. Объясните пожалуйта.
Плюс говорится, что один (левый или правый) фолд может работать с бесконечными листами, а другой нет. Как это понять?
>>1454783 Насчет бесконечных листов: правая свертка завершается на бесконечном цикле из-за ленивости: если известен левый операнд функции, а правый по какой-то причине не нужен, то вычиление прекращается.
Например, пусть есть mlist = [Just 1, Just 2, Nothing, Just 3, ...] -- Дальше Just N и функция sumM :: Num a => Maybe a -> Maybe a -> Maybe a sumM (Just x) (Just y) = Just (x + y) sumM _ _ = Nothing
Добрый день, совсем я совсем зелёный нюфан, начавший читать книгу из оппоста. К сожалению в своё время часто пропускал вузовский курс математики, сейчас думаю самостоятельно наверстать упущенное. С чего начать? Что читать дальше из того, что конкретно будет полезно при изучении хаскеля?
>>1469254 Если хочешь просто писать на хацкеле, то матеша не нужна. Ну а так, кроме элементарной алгебры и теории множеств посмори еще на теорию категорий - ею хацкель и вдохновлен. мимо первокурсник, судящий по первой лекции алгебры и начитавшийся статьей про хаскель
>>1470070 У меня та же проблема. Пока прицелился на: https://stepik.org/course/1127/syllabus https://stepik.org/course/126/syllabus (и куда-то проебалась линейная алгебра, видимо, выпилили курс) Но тут стоит оговориться, для подобных отечественных курсов характерно то,что они скорее отфильтровывают тех, кто нихуя нипонил, чем пытаются научить. В итоге приходится читать кучу сторонней литературы, после которой дальше блок/курс проходить нет смысла, т.к. всё уже узнал из сторонних источников.
>>1470934 Спасибо, судя по описанию как то, что нужно (попробовал посмотреть Москвина, услышал "лямбда исчисления", загуглил , охуел и понял что нужно всё же математику подтянуть).
>>1471115 Не, Москвин тем и хорош,что можно с нуля навернуть хаскеля. Я так и сделал, когда не смог раскурить красную книгу по Scala, а у меня гуманитарная вышка, про все эти алгебры и математике вообще не в курсе. Ну жопа иногда извергала плазму от заданий, иногда бросал на пару месяцев, но ничего - на 90%+ осилил в результате оба курса.
Он там практически всё объясняет по нескольку раз с разных концов и с разными формулировками (как и положено хорошему преподавателю).
Сука, в вузе изучаю на алгебре хаскель. Пздц дрочу на алгебру, а мне говорили что борщехлебской вышки не существует. только вторая неделя, а я уже понял что такое моноиды, группы, кольца и поля. Боюсь представить что будет через 4 года
>>1477274 К сожалению, этот анон оказался прав. Спустя две лекции у нас начались матрицы и кривые второго порядка, что нихуя неинтересно :с >>1479589 Та я просто препода слушал, а потом дома уточнял определения по википедии.
>>1479946 Так там дальше в хаскеле вроде теоркатная всякая шняга идёт, которая в кодинге используется: функторы, аппликатвы, монады, котрвариантные функторы, комонады, бифункторы, профункторы (больше не знаю, лел)
http://learnyouahaskell.com/chapters
Походу, я единственный и не очень умный вкатывальщик в этот странный язык.