Это копия, сохраненная 30 июня 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
> Всякие скалы-кложи времени на обучение потребуют больше, а профита кроме "выразительности кода" не дадут.
Не знаю насчёт скалы, но иммутабельность и транзакционность структур данных в Clojure дают распараллеливание for free.
Более того, лучше язык — лучше код — меньше ошибок. Чем это не аргумент в пользу более совершенных языков?
Так, чтобы зависимости ставились локально.
А то давеча ставил пандок с помощью cabal, умер от dependency hell.
двачую вопрос, это походу самое больное место хаскеля
Бамп.
да нахер он нужен
Что блять значит локально, а они у тебя где поставились? Что бы не было ада пользуй сендбоксы, они пока не вышли но это же Хачкель, что ты ожидал?
>Что блять значит локально, а они у тебя где поставились?
Поставились куда-то в ~/.cabal.
Локально значит в директорию с проектом. Нужна пакету версия 3.14 - поставится 3.14, даже если другой части проекта нужен 3.15 (будет две версии).
Ебанько штоле?
cabal sandbox init в какой-то папке
cabal install huy устанавливает huy в этой папке
x <- somethink
А то я заебался передавать по цепочке функций x, только потому что он нужен только в последней из них.
А если их с десяток?
function1 x =
...[.....]
....where
...........function2 = ......
...........function3 = ......
...........function4 = ......
...........function5 = ......
...........function6 = ......
...........function7 = uses x
А мне надо
x <- getConfig
main = do
...n<-etc
...functuion n ass
......where
.........ass = doSomethinkWith x
Как то так
Ты меня не понял.
Ну и хрен с ним, я все равно неправ был.
Расскажите лучше как в async данными между потоками обмениваться? Своими словами, документацию я и сам почитать могу.
Исправил warnings компилятора, теперь не понимаю что это.
Что-нибудь из серии не для чайников, ибо я уже немного шарю в фп (правда с динамической типезацией, лал: схема, кложура, эрланг)
cabal sandbox?
Java-господин, заглядывает в эту петушиную хату. Порог не переступает что бы не зашквариться, и кричит "Зачем нужен ваш санный Haskell? Где его вообще применяют, кроме мозгового онанизма?".
Вот каким образом развратник приступил к омерзительной операции. Его окружили четверо хаскель-ганимедов: один держал наготове большой ночной горшок, второй взял зажженную свечу и подставил ее поближе к анусу, чтобы было лучше видно происходящее, третий сосал ему член, четвертый, перекинув через руку белоснежное полотенце, целовал Стасика в губы. Тот, опершись еще на двоих педерастов, поднатужился, и как только появилось невероятное количество дерьма, которое обыкновенно и регулярно выдавал хозяин замка, учитывая страшное количество поглощаемой им пищи, тот юноша, что держал вазу, принялся восхвалять экскременты. "Какое прекрасное хаскель-дерьмо! - восклицал он. - Ах, господин мой, какое превосходное хаскель-говно! Как красиво вы испражняетесь".
Когда дифирамбы закончились, педераст, вооруженный салфеткой, языком очистил преддверие ануса, а горшечник подставил содержимое горшка под нос Стасику и опять громогласно восхвалял его. После этого мощная струя мочи ударила в рот сосателю, который тут же проглотил всю жидкость, полотенце завершило то, что не мог сделать язык, и четверо ганимедов, оставшись без дела, долго сосали поочередно язык, фаллос и задний проход распутника.
>Да.
С помощью знаменитого джява-паттерна najtiElementVMassive, я надеюсь?
Как только перепишешь его так, чтоб он занимал не больше 10 строк кода - приходи.
Сразу же после того, как ты напишешь квиксорт, который
а) будет в функциональном стиле
б) короче, чем он же на крестах
в) не будет отсасывать у пузырька, написанного восьмиклассником на сишке.
хуйню не неси, когда ваша махаркайка обзаведется нормальной средой программирования и набором библиотек тогда по кукарекай петушок. А то что в вашей параше можно написать пару алгоритмов короче чем в джаве не аргумент.
Набор библиотек есть. Насчет IDE не всё так однозначно. На каком-нибудь питоне вполне нормально всё пишется без неё, в чем-то вроде саблайма. На джаве же уже как-то так сложилось что жирная IDE must have.
> ахуенный же.
http://соснули.рф/
Как только выучишь наизусть, разберешься, что уже пофиксиили - приходи.
>не больше 10 строк кода
Ох лол нет ничего тупеее чем дрочь на строчки. Из-за таких даунов считается нормой писать ебучие однострочники с дублями в трех местах. Даже в няшном шарпике теперь стрелочками в жопу ебутся.
А могли бы про ReaderT посоветовать почитать. Какой то бесполезный у вас ресурс.
не передергивай.
Как я полагаю, ты по старой памяти пришёл сюда за тугой струёй элитной урины в ебало, но во-первых, претензионность в этом году не в моде, во-вторых хаскель элита покинула борды, и только Стасик иногда мелькает. Сидят тута одни нюфаги и слоупоки, которые тебе нихуя не пояснят.
мимо
> хаскель элита
Не знаю как все, и вряд ли ко мне это относится, но раньше я любил участвовать в таких тредах, а потом меня просто заебал весь этот хаскель, программирование, плт. Просто не возбуждает, не вводит в изменённое маниакальное состояние сознания, как когда-то. Спорить и что-то доказывать лень, потому что абсолютно похуй что там какие-то долбоёбы себе думают и как они относятся к хаскелу и тд. Захожу в пр изредка, и с угасающей надеждой, что как-нибудь снова торкнет.
А зачем спорить? Лучше отвечай на вопросы ньюфагов и слоупоков.
Вот мне, например, надо узнать какие типы исключений используются в пакете HTTP, чтобы не парсить их подобным образом
https://programmers.stackexchange.com/questions/250941/how-do-you-handle-specific-networking-exceptions-in-haskell
В исходниках HTTP ничего не нашел. Вот ты знаешь как определить какие типы там используются?
Там треш какой-то:
https://github.com/haskell/HTTP/blob/master/Network/HTTP.hs#L159
https://github.com/haskell/HTTP/blob/master/Network/Stream.hs#L37
https://github.com/haskell/HTTP/blob/master/Network/HTTP.hs#L205
http://hackage.haskell.org/package/base-4.7.0.2/docs/Prelude.html#v:fail
Хаскель не для этого, писал бы на скале лучше. Но если всё-равно хочешь, то по прикладным вопросам лучше всего спрашивать в #haskell (irc.freenode.net). Прямо сейчас в конфочке 1476 человек.
А ведь и правда треш.
>Хаскель не для этого, писал бы на скале лучше.
А для чего тогда Хаскель? в третий раз на борде спрашиваю
И чем скала лучше хаскеля?
И спасибо за ответ, сам не смог как то найти.
> А для чего тогда Хаскель?
Для того, чтобы экспериментировать с архитектурными решениями, стающими возможными благодаря таким-то и таким-то фишечкам системы типов: тайпклассопедия, прочие braided категории, линзы, и всякие пруф-оф-концепты поверх этого.
> И чем скала лучше хаскеля?
Конкретно в этом вопросе, тем, что там монадическая обработка ошибок построена как овеществлятор существующих джавовских эксепшнов и такой хуйни как в хаскельном http в библиотеках не встретишь.
http://danielwestheide.com/blog/2012/12/26/the-neophytes-guide-to-scala-part-6-error-handling-with-try.html
http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.util.Try
юзай Сноймановский http client
http://hackage.haskell.org/package/http-client-0.4.6.2/docs/Network-HTTP-Client-Internal.html#t:HttpException
А есть что-то такое же модное, как скала, но чтобы компилировалось в нейтив?
Расту до Скалы и Хаскеля как до луны. Это неплохая замена С/С++/D, но не надо думать, что он где-то рядом с двумя из предыдущего предложения. Я бы сказал, он с похожими ценностями, но в своей области (байтоблядство), и область эта накладывает серьёзные ограничения на абстракцию, выразительность и тд. Кстати, Раст сложноват. Особенно писать на нём алгоритмы и структуры данных с обратными ссылками. Вся эта линейная типизация борровинга указателей, все эти лайфтаймы - иногда это превращается в развлечение аля Агда/Кок.
нет. как только борщеед получает от мамки говноподелку на андроиде, он ощущает, что даже ЭТО роскошь, по сравнению с его жалким существованием борщееда. и после этого он начинает учить какое-то говно, что бы зарабатывать денюжку и съебаться с под мамкиной юбки
лучше умереть с голоду, но остаться господином
Окамль классный. Та же скала, но без жвм, в чём-то чище и выразительнее, в чём-то хуже (имплиситов пока нет, например). SML c расширениями тоже хороши и ум в порядок приводят.
Харпер вот пытается как-то поддерживать движуху:
http://sml-family.org/
https://github.com/SMLFamily
ocaml has no concurrency
http://haskell.dshevchenko.biz/
Haskell для удовлетворения эстетических потребностей. Бездушно писать программки под водочку и картофанчик можно и на C++ или другом языке рабов.
https://www.techempower.com/benchmarks/#section=data-r9&hw=ec2&test=query
Там у них два есода, один норм, второй какой-то тормозной.
ну и зачем етот ваш хаскиль, если монады даже в php можно сделать?
http://habrahabr.ru/post/231801/
data X = X !Y
У меня есть одна:
http://habrahabr.ru/post/134432/
Ебанутая задача, решенная ебанутым методом, но хуй знает, насколько реально решить ее каким-то другим
>Задача, на первый взгляд, простая: на каждый запрос на чтение блока (команду SCSI) отдаем содержимое этого блока. Блок может либо принадлежать какому-нибудь из «файлов», либо содержать служебную информацию FAT.
>Первая мысль была, конечно, запаковать образ FAT при помощи, например, bzip2 и распаковывать на устройстве по мере надобности.
>Задача, на первый взгляд, простая: перейти дорогу.
>Первая мысль была, конечно, найти в смартфоне это место на гуглокартах и ориентироваться по панораме, определяя направление по компасу.
Расскажите о Best Practices обработки исключений. Где их ставить обработчики в месте где они возникают, или где нибудь в main?
Антуаны, почему не создать общий около-FL тред, чтобы в кучу все эти ваши хасколы, окамлы-фшарпы, кложуры и прочие немерли с скалы?
А то утомительно, полтора анона на всю ветку. А задачи все решают похожие.
В качестве бонуса: срач какой из функциональных языков функциональнее.
Хачкель - это функция акермана от крестов. Там где в крестах сборник велосипедов на уровне кода, максимум на уровне композиции классов в хачкеле велики начинаются на концептуальном уровне (благо язык позволяет). Велосипеды же рождают велосипеды, поэтому писать компьютерные программы на хачкеле сложнее, хотя наверное гораздо веселее.
Ну как тебе по-другому сказать? Дикая концептуальная и парадигменная фрагментация сообщества и кодовой базы - проблема применимости хачкеля.
Возможно ли реализовать функцию from_list для пикрелейтед модуля?
Пробовал так:
let rec from_list: type a b. a list -> b t = function
| [] -> Nil
| x::xs -> Cons(x, from_list xs)
но компилятор ругается, что this expression has type List.zero List.t
but an expression was expected of type b List.t
Type List.zero is not compatible with type b
Я тут подумал: наверное, всё-таки нельзя, т.к. тип можно будет узнать только в рантайме, а типизация-то статическая.
elemIndex
Haskell:
static int najtiElementVMassive(Object massiv,Object element){
\t\tif(massiv instanceof int[]) {
\t\t\tfor(int i=0; i<((int[])massiv).length; ++i)
\t\t\t\tif(((int[])massiv)==(int)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof byte[]) {
\t\t\tfor(int i=0; i<((byte[])massiv).length; ++i)
\t\t\t\tif(((byte[])massiv)==(byte)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof boolean[]) {
\t\t\tfor(int i=0; i<((boolean[])massiv).length; ++i)
\t\t\t\tif(((boolean[])massiv)==(boolean)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof char[]) {
\t\t\tfor(int i=0; i<((char[])massiv).length; ++i)
\t\t\t\tif(((char[])massiv)==(char)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof float[]) {
\t\t\tfor(int i=0; i<((float[])massiv).length; ++i)
\t\t\t\tif(((float[])massiv)==(float)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof double[]) {
\t\t\tfor(int i=0; i<((double[])massiv).length; ++i)
\t\t\t\tif(((double[])massiv)==(double)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof short[]) {
\t\t\tfor(int i=0; i<((short[])massiv).length; ++i)
\t\t\t\tif(((short[])massiv)==(short)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof long[]) {
\t\t\tfor(int i=0; i<((long[])massiv).length; ++i)
\t\t\t\tif(((long[])massiv)==(long)element)
\t\t\t\t\treturn i;
\t\t} else {
\t\t\ttry {
\t\t\t\tfor(int i=0; i<((Object[])massiv).length; ++i)
\t\t\t\t\tif(sravnitMassivi(((Object[])massiv),element))
\t\t\t\t\t\treturn i;
\t\t\t} catch (Exception e) {
\t\t\t\tfor(int i=0; i<((Object[])massiv).length; ++i)
\t\t\t\t\tif((((Object[])massiv)).equals(element))
\t\t\t\t\t\treturn i;
\t\t\t}
\t\t}
\t\t
\t\treturn -1;
\t}
\t
\t
\tstatic boolean sravnitMassivi(Object massiv1,Object massiv2) {
\t\ttry {
\t\t\tif((((Object[])massiv1)).length!=(((Object[])massiv1)).length) return false;
\t\t\tboolean ravni=true;
\t\t\tfor(int i=0; i<(((Object[])massiv1)).length; ++i)
\t\t\t\travni=ravni&&sravnitMassivi((((Object[])massiv1)),(((Object[])massiv2)));
\t\t\treturn ravni;
\t\t} catch (Exception e) {
\t\t\tif(massiv1 instanceof int[]) {
\t\t\t\treturn Arrays.equals((int[])massiv1,(int[])massiv2);
\t\t\t} else if(massiv1 instanceof byte[]) {
\t\t\t\treturn Arrays.equals((byte[])massiv1,(byte[])massiv2);
\t\t\t} else if(massiv1 instanceof boolean[]) {
\t\t\t\treturn Arrays.equals((boolean[])massiv1,(boolean[])massiv2);
\t\t\t} else if(massiv1 instanceof char[]) {
\t\t\t\treturn Arrays.equals((char[])massiv1,(char[])massiv2);
\t\t\t} else if(massiv1 instanceof float[]) {
\t\t\t\treturn Arrays.equals((float[])massiv1,(float[])massiv2);
\t\t\t} else if(massiv1 instanceof double[]) {
\t\t\t\treturn Arrays.equals((double[])massiv1,(double[])massiv2);
\t\t\t} else if(massiv1 instanceof short[]) {
\t\t\t\treturn Arrays.equals((short[])massiv1,(short[])massiv2);
\t\t\t} else if(massiv1 instanceof long[]) {
\t\t\t\treturn Arrays.equals((long[])massiv1,(long[])massiv2);
\t\t\t} else {
\t\t\t\treturn massiv1.equals(massiv2);
\t\t\t}
\t\t}
\t}
elemIndex
Haskell:
static int najtiElementVMassive(Object massiv,Object element){
\t\tif(massiv instanceof int[]) {
\t\t\tfor(int i=0; i<((int[])massiv).length; ++i)
\t\t\t\tif(((int[])massiv)==(int)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof byte[]) {
\t\t\tfor(int i=0; i<((byte[])massiv).length; ++i)
\t\t\t\tif(((byte[])massiv)==(byte)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof boolean[]) {
\t\t\tfor(int i=0; i<((boolean[])massiv).length; ++i)
\t\t\t\tif(((boolean[])massiv)==(boolean)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof char[]) {
\t\t\tfor(int i=0; i<((char[])massiv).length; ++i)
\t\t\t\tif(((char[])massiv)==(char)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof float[]) {
\t\t\tfor(int i=0; i<((float[])massiv).length; ++i)
\t\t\t\tif(((float[])massiv)==(float)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof double[]) {
\t\t\tfor(int i=0; i<((double[])massiv).length; ++i)
\t\t\t\tif(((double[])massiv)==(double)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof short[]) {
\t\t\tfor(int i=0; i<((short[])massiv).length; ++i)
\t\t\t\tif(((short[])massiv)==(short)element)
\t\t\t\t\treturn i;
\t\t} else if(massiv instanceof long[]) {
\t\t\tfor(int i=0; i<((long[])massiv).length; ++i)
\t\t\t\tif(((long[])massiv)==(long)element)
\t\t\t\t\treturn i;
\t\t} else {
\t\t\ttry {
\t\t\t\tfor(int i=0; i<((Object[])massiv).length; ++i)
\t\t\t\t\tif(sravnitMassivi(((Object[])massiv),element))
\t\t\t\t\t\treturn i;
\t\t\t} catch (Exception e) {
\t\t\t\tfor(int i=0; i<((Object[])massiv).length; ++i)
\t\t\t\t\tif((((Object[])massiv)).equals(element))
\t\t\t\t\t\treturn i;
\t\t\t}
\t\t}
\t\t
\t\treturn -1;
\t}
\t
\t
\tstatic boolean sravnitMassivi(Object massiv1,Object massiv2) {
\t\ttry {
\t\t\tif((((Object[])massiv1)).length!=(((Object[])massiv1)).length) return false;
\t\t\tboolean ravni=true;
\t\t\tfor(int i=0; i<(((Object[])massiv1)).length; ++i)
\t\t\t\travni=ravni&&sravnitMassivi((((Object[])massiv1)),(((Object[])massiv2)));
\t\t\treturn ravni;
\t\t} catch (Exception e) {
\t\t\tif(massiv1 instanceof int[]) {
\t\t\t\treturn Arrays.equals((int[])massiv1,(int[])massiv2);
\t\t\t} else if(massiv1 instanceof byte[]) {
\t\t\t\treturn Arrays.equals((byte[])massiv1,(byte[])massiv2);
\t\t\t} else if(massiv1 instanceof boolean[]) {
\t\t\t\treturn Arrays.equals((boolean[])massiv1,(boolean[])massiv2);
\t\t\t} else if(massiv1 instanceof char[]) {
\t\t\t\treturn Arrays.equals((char[])massiv1,(char[])massiv2);
\t\t\t} else if(massiv1 instanceof float[]) {
\t\t\t\treturn Arrays.equals((float[])massiv1,(float[])massiv2);
\t\t\t} else if(massiv1 instanceof double[]) {
\t\t\t\treturn Arrays.equals((double[])massiv1,(double[])massiv2);
\t\t\t} else if(massiv1 instanceof short[]) {
\t\t\t\treturn Arrays.equals((short[])massiv1,(short[])massiv2);
\t\t\t} else if(massiv1 instanceof long[]) {
\t\t\t\treturn Arrays.equals((long[])massiv1,(long[])massiv2);
\t\t\t} else {
\t\t\t\treturn massiv1.equals(massiv2);
\t\t\t}
\t\t}
\t}
Но в Хаскеле нет массивов
Сортировку сложно написать. Монады слишком абстрактные чтобы понять.
Тебе наверное так кажется, потому что ты хачкелист. Попробуй очистить разум и подумать об этом с белого листа.
Достаточно вспомнить, что подходов к обработке ошибок в хаскеле пожалуй даже больше, чем реализаций умных указателей в С++.
Вот это напрягает, согласен. Что бы не придумал, все время получается кривой велосипед.
смешание чисто-императивного подхода (и динамической типизации) с ленивой семантикой приводит к таким вот аномалиям
неудивительно что на этом языке никто не программирует
Слишком толсто
И что это?
Щито поделать, если крестомакаки не сумели многопоточную версию запилить?
Алсо, однопоточный вариант на хаскеле възебывает сипипи.
А ну да, фортран тоже на одном ядре. Но всё равно, всем известно что сишный код даже на одном ядре рвёт всякую новомодную многопоточную парашу, а тут вроде многопоточный код на сишке, хоть и хуёво написаный (одно ядро недогруз), проёбывает яваговну. Кажется мне, что тест говно. Есть исходники?
Блять, а на сишке он сам распараллелился штоли? Просто так написали (ногами).
{
"GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG"
"GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA"
"CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT"
"ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA"
"GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG"
"AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"
"AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
};
Бред какой-то, наверняка задача оптимизирована под язык.
> задача оптимизирована под язык.
интересно, какие методы позволяют заточить задачу под перл или другой конкретный язык. Имеется в виду производительность.
кекович
Хули ты там делишь, дурак? Кто виноват что кресты - это перделка для студентов, которая не может в многопоточность.
Глупый плюсоёб, глупый. Там столбец CPU Secs, мог бы по нему сравнить.
Тогда бы ты, наверное, заметил, что две версии на хаскеле (однопоточная и плохораспараллеленая) всё равно взъёбывают версии на крестах.
>Кресты - мощный инструмент для профессионалов, а не студентов, которые не могут в многопоток.
Лол, немного поменять порядок слов, и вскукарек фанбоя станет больше похож на правду:
>Кресты - мощный инструмент для студентов и непрофессионалов, которые не могут в многопоток.
Аппликативные функторы-то завезли?
Всё сидите тута без линейных линейных и афиных типов как сычи? Когда уже хозяева ваших анусов признают, что они допустили страшную ошибку, сделав работу с RealWord в хаскеле через монадическое IO говно?
Почему у вас IO сделано через монады, когда в нормальных чистых фя типа Clean оно сделано без них и работает быстрее и удобнее?
А эти твои линейные типы годны на что-нибудь кроме IO (с которым и монады справится могут)? А систему эффектов на них сделать можно?
А то таскают тут всякие говно из плюсов, а сами даже зависимые типы запилить не могут.
Конечно, помимо этого они дают нормальную поддержку изменяемых по месту структур данных без потери ленивости и referential transparency.
Вот в общем у димона неплохой доклад
http://thedeemon.livejournal.com/37515.html
Конечно афиные типы это такое, полумеры на мой взгляд, линейные как в Mercury более основательны, хоть и требуют определенного количества пунктов ментальной силы, чтобы их применять.
Спросил в лиспотреде, но он что-то не хочет бампаться, сраная макаба.
Лиспаны, начал тут учить Clojure, не могу никак вьехать.
Зашел на
https://www.4clojure.com/problem/2
Там вроде просто, вбиваю
(= (- 10 (* 2 3)) 4)
Мне пишет что юнит-тесты оно не проходит. Как дальше жить то?
Все бампается, уже ответил.
Какой-то он странный: вроде взрослый и местами негупый человек, а ведёт себя как школьник-двачер.
Он всегда таким был или это уже старческие болячки его подкосили?
Не тральте меня особо плиз)
Недавно решил, что создавать абстрактные фабрики фабрик - это не очень тру, и решил почитать что по функциональщине. Так знаком с ней на уровне указателей на функции, делегатов и лямбд в нормальных языках (т.е. не знаком вообще).
Думал обмазаться эрлангом каким или хачкилем.
Посоветуйте годную книжку? Или место, откуда начинать?
(Знаю, советовали уже раз 20 наверно, но мне лень искать, так что обоссыте, но всё равно посоветуйте, к?)
Начинай с хаскеля, в эрланге функциональщина такая себе.
В общем:
Книга - Real World Haskell
И соответствующий раздел на викибукс:
http://en.wikibooks.org/wiki/Haskell
Грема Хаттона, Душкина или Learn You a Haskell for Great Good - не читай, это говно для даунов и пустая трата времени.
О, кого-то нового говном обозвали, надо почитать.
Лучше по этому гайду учи
http://bitemyapp.com/posts/2014-12-31-functional-education.html
Чувак там все четко расписал, что стоит читать, что не стоит.
всё хуйня кроме Real World Haskell и Typeclassopedia, нодискасc
Есть и отличный набор библиотек с исходниками, менеджером пакетов и документацией (в джавапомойке ничего подобного нет, приходится качать какие-то джарники непонятно откуда и жрать убогие жавадоки), и отличная IDE.
Любые. Если тупо юзать thow. Более того, возможны асинхронные исключения, если кто-то вызвал throwTo. Если хочется аналога checked exceptions, то можно использовать MonadError, control-monad-exception и тому подобное.
Бенчмарки разные бывают: http://www.yesodweb.com/blog/2011/03/preliminary-warp-cross-language-benchmarks (кстати, winstone - это джава, почему у winstone такой хуёвый перформанс?)
>Где их ставить обработчики
Так же, как и в остальных языках - в месте, где ты можешь адекватно исключение обработать (putStrLn "Ой, какая-то хуйня случилась.." - не есть адекватная обработка).
obj.getClass().isArray()
азазазаз
збс
Не, вроде не он. Там ссылка на ftp сервер была; и про буддизм что-то тут ничего не вижу.
Не слушай этого дауна. Learn You a Haskell for Great Good - годная книжка с цветными картинками. А вот Real World Haskell - устаревшее говно. Читай Изучаем Haskell от Алехандро Серано Мена. Но лично я без Learn You a Haskell for Great Good нихуя бы не понял
Только после прочтения Learn You a Haskell for Great Good нихуя не знаешь Haskell даже на интермедиант левеле, так как всё подаётся на уровне "эту хуйнюшку вот сюда, а вот эту вон туда и тогда получается вон то гыгыгы" и идёшь искать другую книжку, где хоть что-то нормально объясняют.
>лично я без Learn You a Haskell for Great Good нихуя бы не понял
Не нужно экстраполировать свою имбецильность на всех.
Лол. Категория как понятие в объёме необходимом для хаскеля это и есть хрень уровня "ну эт типа значение в коробочке))0". Просто люди по незнанию берут первую попавшуюся книгу по теоркату, а там книженция уровня оснований математики или топологии (что не каждый профессиональный математик из других направлений сходу разберет) и тут у них остатки мозгов заворачиваются. Хотя это чистый оверкилл.
> хрень уровня "ну эт типа значение в коробочке))0"
Чё, бля? Категория - это перегрузка стрелочки на уровне типов, и (.) с id на уровне значений.
Нихуя не оверкил, ты либо понимаешь монаду как моноид из категории эндофункторов и класс монад как реализацию этого в хаскеле, либо ты нихуя не понимаешь. И так почти со всем в хаскеле. Хотя, чтобы применять, понимание не нужно, достаточно макака-знаний на уровне "значений в коробочке".
Чего бы не спросить это в саентаче в математико-треди?
Кудасхелевыблядки - не люди. Period. Sage & hide.
Хуита. Куча ненужных слов и определений ради того, что можно выразить в три строчки используя множества.
И да, слова вроде «эндофунктор» сравни слову «флогистон»: даёт иллюзию понимания, фактически не объясняя ничего. А потом берутся всякие петушки с «быстрой сортировкой» в хаскеле в строчку.
Тебе, как я посмотрю, так понравилось озалупливание в квиксорт-треде, что ты нашел другой хаскелетред, раздвинул булки и дрожишь от предвкушения содомирования эндофунктором?
Тебя обоссали в твоём треде про квиксорт, так ты сюда пришёл за добавкой урины, неандерталец?
>можно выразить в три строчки используя множества
Что несёт блять. Ну давай мне определение монады в терминах теории множеств, без перебегания к понятиям стрелок.
> да, слова вроде «эндофунктор» сравни слову «флогистон»
Ну для гуманитария может быть, а так это всего лишь функтор из категории в неё же.
Ты объяснил мне все. Правда.
функтор - это специальный вид отображения (функции)
динамческий массив, ты забыл сказать
если ты долго смотришь в монаду, то монада тоже смотрит в тебя
Семь раз забиндь, один раз вычисли
просто потому что стасик в треде и хуле нам кабанам?
Нет, ты нихера не понял. Суть ТК это морфизмы, связи между элементами, а не сами элементы. Суперпозиция функций - это то из чего родилась ТК и это сама её суть.
I уровень абстракции: от понятий "два камня" и "два яблока" к числу 2, от понятия "камень повернулся боком" к понятию поворота на 90°.
II уровень абстракции: от конкретных чисел к кольцу целых чисел, от поворотов предметов к группам трёхмерных вращений.
III уровень абстракции: от групп вращений и иных преобразований к абстрактным группам со строго очерченными свойствами.
IV уровень абстракции (теория категорий):
от абстрактных групп к сети взаимосвязей различных пространств, колец, выделение групп взаимосвязей и изучение связей между связями.
В теории множеств фейлит на IV уровне, потому что конструкция отображения является ни первичной, ни даже вспомогательной к самим множествам. В то время как в ТК морфизмы входят в аксиоматическое определение категории наравне с объектами. Более того, объекты - лишь частные случаи преобразований. Теория множеств изучает застывшие, "мёртвые" объекты, ТК - изучает их движения.
В догонку, какое-то новое знание ТК прибавила или просто красиво разложила все по полкам?
http://www.epam.com/careers/ukraine/kyiv/jo/8434.html
вот теперь я верю, что у хаскела есть будущее
Есть ли существенные минусы?
1. После Хаскеля ни на чем другом не охота писать кроме Агды
2. Ебаный пролог на уровне тайпклассов, ехал lift через lift, дохуя бойлерплейта на type-level, затыкаемого ональной магией вроде автоматического datatype promotion, препроцессора (TH) для генерации синглетонов, причем чтобы всё это говно не конфликтовало с твоими идентификаторами, к нему прихуячиваются префиксы (типа S - это синглетон, '[] - кайндконструктор, чтобы не конфликтовало с [] - тайпконструктором). Короче, полная хуйня на тайплевеле, надо всё это выкинуть и сделать уже нормальные зависимые типы.
А меня вот так накрыло: после хаскеля, скалы, пурскрипта и руста, не охота писать ни на чем кроме ультраминимальных динамически-типизированных скриптов (петон, кофе, мунскрипт, вот это всё).
Руби и кложур - это ёбаное метаговно для любителей подрочить на код вместо того чтобы побыстрее решить задачу. В питоне не надо писать "end end end end end end" и "((((()))))))))))()()((((((((()()()(((((((((()()()))))))))))))))))))))))))))))))))))))))()()(", и это то что реально полезно на практике, а не блять возможность перегрузить method_missing или всякие ебучие макросы, которые позволят (и то - не всегда) сэкономить символов (по сравнению с реализацией того же самого на функциях и объектах на питоне) меньше, чем будет потеряно на скобки.
двачую этого
Только не забывай что у питона тоже есть куча всего вкусного, например, метаклассы, а ещё декораторы
ЗЫ: Рубисты сраная хипстота
ЗЫ2: пошел писать скрипт для управления виртуальными машинами на API virsh. А рубисты сосут хуй, потому что к руби биндингов нет.
ой, да ну?
Писал на хаскеле, только вот не годится он для прикладных задач. Библиотек нет. Так что не охота на нем писать, потому что большое хуй че напишешь.
>Писал на хаскеле, только вот не годится он для прикладных задач. Библиотек нет
Можно примеры?
>Библиотек нет.
1. Каких, например?
2. Написание программы на Хаскеле вместе с недостающими библиотеками обычно занимает меньше времени, чем конфигурация xml-ных конфигов джаваговнеца.
>>445929
А вот не надо пиздеть. По скорости написания программ хаскель сливает всему кроме теорем пруверов по очевиднейшим причинам:
- овеществление эффектов
- отсутствие специального синтаксиса для элементарных вещей типа индексирования, мутирования, циклов, экспешнов
Даже когда есть все нужные библиотеки. Ты будешь тужиться над одним монадическим методом в 100 раз дольше, чем на любом нормальном языке, потому что тебе вместо
if yoba_1(f(x)) < yoba_2(g(y)): i_pognali(z)
надо сначала осознать а потом написать:
a <- f x
b <- g y
c <- (<) <$> yoba1 a <*> yoba2 b
when c $ do
iPognali z
Менеджмент первоклассных эффектов - это так же продуктивно как менеджмент первоклассного синтаксиса у лисперов. Можно написать кастомную хуйню, которая ничего не делает, а всё что что-то делает писать в 100 раз дольше и неудобнее.
Ну ладно, для случаев когда кастомная хуйня ещё не встроена в нормальные языки, хаскель может побеждать по удобству, так что пишите квантовые алгоритмы в монаде QIO.
a <- f x
b <- g y
c <- (<) <$> yoba1 a <> yoba2 b
when c $ do ...
или может лучше:
a <- yoba1 =<< f x
b <- yoba2 =<< g y
when (a < b) $ do ...
или может лучше:
a <- f x
b <- g y
((<) <$> yoba1 a <> yoba2 b) >>= flip when $ do ...
или может лучше написать утилитарный whenM и:
ltM ma mb = (<) <$> ma <*> mb
и заюзать как-то типа:
whenM ((yoba1 =<< f x) `ltM` (yoba2 =<< g y)) $ do ...
или как там блять ещё.
Отличный способ провести время, в общем.
Скорость написания от опыта больше зависит, мне кажется.
Во всяких питонах ты уже привык отслеживать, например, состояние переменной в голове, поэтому можешь писать не задумываясь. А к особенностям хаскеля ещё не привык.
Тебе кажется. С хаскелем у меня в 100 раз больше опыта чем с питоном, но на питоне я в 100500 раз продуктивнее, даже его не зная. От опыта это, конечно, зависит, но на хаскеле в принципе нельзя продуктивно, да и вообще это бессмысленно, писать что-то кроме экзотических вещей вроде алгоритмов с автоматическим дифференцированием или квантовых вычислений. И то - это осмысленно лишь до тех пор пока для этого не создадут специальные языки, где такие стратегии вычислений будут встроены. В общем, всё то же самое что и с лиспами.
Я где-то видел статью, в ней рассказывали о своих приключениях при переписывании какой-то йобы с питона на хаскель.
В общем вышло, что кодить на хаскеле выходит раза в два медленнее, но весь цикл разработки занял примерно столько же времени.
Однажды читал книгу про приключения твоей мамки в дагестане. Так вот, в ней было написано, что твоя статья - обычный пеар параши.
Ну ти траль.
В "нормальном языке" ты всё равно будешь тратить в джва раза больше времени на фабрики абстрактных бобов-синглетонов, а потом еще тратить время на отладку из-за какого-нибудь побочного эффекта.
Он на это не ответит, потому что он - очевидный пиздабол.
Нихуя, бобы пишутся быстро
Создал новый класс, вбил свойства, сгенерил конструтор и геттеры
ИДЕ после этого выдает подсказки/автодополняет по свойствам
И не говори. Мне вот интересно, а ява-сеньорам не приходило в голову, что мусорные конструкции, которые запросто генерирует IDE, можно было давно выкинуть.
ОБРАТНАЯ СОВМЕСТИМОСТЬ, к ее отсутствию хаскеляторы тоже привыкли, наверное.
Сколько примеров нарушения обратной совместимости ты можешь привести в Хаскеле, толстячёк?
Ещё не начал, а уже весь тред жиром залил.
Ну ничего, потихоньку уже начали сахарок запиливать, к выпуску Java 64 уже можно будет не прибегать к услугам кодогенерации IDE
Возможно, к тому времени в хаскелле появится ИДЕ.
Правда более вероятно то, что к 64му выпуску джавы место хаскелля займет другой академический язычок.
С чего ты взял?
По неё. Когда идея станет работать так же стабильно, как эта "поделка" можно будет говорить о наличие в джаве IDE.
Зачем вообще что-то автоматизировать, если есть толпа не имеющих образования, но желающих работать?
Щито? Ты к чему это?
Затем, что менеджить кодобазу в несколько миллионов строк тебе толпа тестеров никак не поможет.
чет пукнул с этого
Разве нет генератора биндингов? Какие библиотеки надо?
Import Zdelat_vsyo
main = do Zdelat_vsyo.main
А это правильный вопрос.
:t map . foldr
map . foldr :: (a1 -> a -> a) -> [a] -> [[a1] -> a]
[/code]
Может кто-нибудь объяснить сигнатуру? Что такое а1? и что возращает функция, функцию из [a1] в a?
map (foldr f) [a,b,c] = [foldr f a,foldr f b,foldr f c]
Я эмулятор биржи пишу, например. По ощущениям примерно та же хуйня, как если бы на Джаве писал, или на Сишарпе (в плане трудозатрат), но как-то более правильно получается что ли. Т.е. на Джаве или Сишарпе мне пришлось бы заранее выбирать тип для денег (типа деньги правильнее в decimal-ах считать, вроде как считать деньги в double или float - это зашквар), но когда я пишу order book, мне как-то совершенно не хочется думать о том, как именно надо считать деньги, мне лишь важно, что ордера матчатся, если bid >= ask и не матчатся в противном случае, а как они там представлены - это уже дело бухгалтерии. И вот в Джаве или Сишарпе мне пришлось бы либо привязываться к конкретному типу, либо вводить кучу классов/дженериков для величин, которые не важны в конкретном алгоритме, а в Хаскеле я обхожусь семействами типов и единственным параметром. Мне так удобнее, короче. В общем Хаскель позволяет точечно абстрагироваться от того, что тебе не нужно в конкретном алгоритме. Это наверняка не важно, если ты заранее всё знаешь о задаче и можешь заранее сказать, что деньги у тебя - децималы, идентификаторы заказов - лонги, идентификаторы инструментов - строки, и что в будущем тебе не придётся менять тип какой-нибудь хуйни. Ну т.е. в Джаве надо думать о том, что может быть вдруг придётся, и если придётся, то надо использовать интерфейс, а если не придётся - то это овердизайн. А в Хаскеле просто абстрагировался, т.е. просто указал, что я хочу эту хуйню сравнивать, а что там именно - моему алгоритму не важно, и в путь.
Java для быдла, господа выбирают c#
А ты уже.
Статической типизацией.
ос написал не золотце)
нахуй ты этот баян сюда принес?
Тем же, чем и брейнфака.
Можно, но не нужно.
Или просто randomRIO (10^8, 10^9-1)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
а именно части (a -> m b)?
Ведь если результат все равно обязан быть m b, то удобнее подставить более простую функцию (a -> b). Чому мне не дают сэкономить пару лишних нажатий?
смотри fmap
в этой части вся мякотка, няша
Можешь подставить a -> b через liftM
Только сок в том, что return отработает именно так, как определено в контексте той конкретной монады, внутри которой ты его используешь.
суть монад лучше всего показывается с помощью join, а не bind
Для любви в реестре есть f#
Сферических коней в вакууме.
свяршылась
И что? Это ж не питон какой, чтоб ошибки, которые способна выявить статическая типизация, доставляли неудобств.
В том, что ты возвращаешь значение b с эффектом m. Если у тебя просто функция a -> b, без эффекта, то монада не нужна.
С чего ты взял, что мы их не любим? У меня дома живёт один, регулярно его няшу.
Чем это плохо?
Заверни в THUNK.
да
да
нет, ибо нежизнеспособное говно
>Кто нибудь использует cloud haskell?
Нет.
>Есть смысл использовать вместо Erlang?
Если ты про возможность построение системы, где можно послать хуй знает что процессу, который находится хуй знает где и он хуй знает как его обработает (а может быть и не обработает вообще), а потом обмазывать её другими процессами которые перезапускают первые процессы пока они перезапускают другие процессы по те их перезапускают, то не имеет.
этот парашютист порвался
Как поправить или легче снести все к хуям?
Используй cabal-dev или cabal sandbox и будет тебе счастье. Или вообще через портежи поддерживай все это дело
a1 это любой тип
a это любой тип
Эта хуевина принимает функцию, принимающую объект типа a1 и объект типа a и возвращающую объект типа a, и список объектов типа a, и возвращает список функций, принимающих список объектов типа a1 и возвращающих объект типа a.
> всё равно переустановка ничего не стоит
Кроме времени, естественно. То есть, как я понимаю, нет способа поддерживать работоспособность кучи пакетов?
>>458425
>cabal sandbox
Это предполагает, что на каждый чих я буду ставить (и компилировать) дополнительно большое количество пакетов. Или все-таки можно указать доступные из песочницы пакеты?
Короче, сбрил нахуй ~/.{ghc,cabal}
>Кроме времени, естественно.
Запускаеш, идёш пит чай. Используеш -jN для параллельной установки.
>нет способа поддерживать работоспособность кучи пакетов?
В общем случае нет, потому что diamond dependency problem. Учитывая, что пакеты могут явно указывать диапазон версий пакетов от которых они зависят, задача может не иметь решений, например, если ты билдишь А, который зависит от В и С, которые используют разные версии D, и множества допустимых версий не пересекаются. При этом В и С по отдельности могут билдится нормально. Для этого пилится платформа где всё гарантированно билдится.
>Это предполагает, что на каждый чих я буду ставить (и компилировать) дополнительно большое количество пакетов.
Почему большое? Только зависимости.
>LTS
>Haskell
Да ладно, кто там будет его суппортить. Наверняка взяли ту же платформу и засунули её в репозиторий. Если будут проблемы, пошлют к хаскеллистам.
игры про раскраску графов, человек против компьютера, AI и гуй
следуй вот этому гайду:
http://bitemyapp.com/posts/2014-12-31-functional-education.html
Еще хорошие современные книги (первая правда изобилует опечатками)
1) http://www.piter.com/product/izuchaem-haskell-biblioteka-programmista
2) http://haskelldata.com/
3) http://dev.stephendiehl.com/hask/
>в былые времена обмазывался ЛИСПами, Агдой и Коком, но потом всё забыл, работал в далекой от IT области
Кем работал, расскажи о себе, няша?
еще забыл peддиT
/r/haskell/
русскоязычный ресурс
ruhaskell.org
русскоязычный чятик по хаскеллю
гиттер.им/ruHaskell/forall
онлайн-ide
fpcomplete.com/auth/login
ну и сам сайт fpcomplete.com весьма годный.
> следуй вот этому гайду
Но ведь это не гайд ни разу, а просто ссылкопомойка, приправленная большим количеством букв
> izuchaem-haskell-biblioteka-programmista
но ты наверное все равно не поймешь разницы
Есть такое.
RWH - это как уроки литературы в школе. Как бы ни были охуенены Толстой и Достоевский, после школьного вытраха мозга тупытыми сочинениями ты будешь русскую классическую литературу еще лет 5 ненавидеть, пока не попустит. Потому что вместо того чтобы учить наслаждаться красотой слога и стиля, тебя заставляют писать какую-то хуйню на тему что имел ввиду автор, Андрей и Дуб, блядь, тварь я дрожащая, или залупа коня Будулая. Делают они это на голуом глазу, будто так и надо, совершенно упуская из вида, что художественная литература - это интертеймент, это Голливуд 19-го века. Вот какой мудак станет на полном серьёзе искать острый социальный подтекст в фильме "Трансформеры"? Не, он там наверняка есть, но фильм-то смотрят чтобы покайфовать, заценить спецэффекты, получить, прежде всего, эстетическое удовольствие. Если для полного эстетического удовольствия нужно, чтобы автор затронул какие-то философские либо политические струнки, то в хорошем кино это тоже безусловно есть, иначе фильм покажется тупым, неинтересным. Но, прежде всего, фильм - это интертеймент. Вот и с RWH - та же хуйня. В RWH выхолощенный Хаскель. А кому он нахуй такой нужен? Хаскель изучают ради кайфа, ради зигохистоморфных препроморфизмов. Ведь для кастратов есть Джава, которая ни чуть не хуже в этом плане.
>>460770
Нет, он не устарел. В Хаскеле вообще всё заебок с обратной совместимостью, поэтому и знания десятилетеней давности не назовёшь малоактуальными. Проблема не в устаревании, а в подаче материала. RWH уныл. Прочитав RWH сложится лишь одно впечатление: "а нахуя мне Хаскель, я бы мог сделать это и на Джаве.." Т.е. чисто в техническом плане с RWH всё заебок, но он не даёт никакой эстетики абсолютно. За эстетикой нужно гнать в functional pearls, typeclassopedia для начала, чтобы понять, как математические абстракции могут реифицироваться в языке программирования, и словить от этого кайф. Вот тогда язык будет изучать интересно и приятно. А нахуй его учить по техническому мануалу RWH - вообще не понятно. Это имело бы смысл, если бы ты был ссаным школьником, который через силу учит востребованный рынком ЯП чтобы устроиться на работу. Но Хаскель рынком нихуя не востребован, его учат не ради того, чтобы батрачить, а ради того, чтобы поймать кайф, которого в RWH нет. Поэтому RWH не нужен, я считаю. Ну или нужен чисто как технический справочник, если ты уже решил что хочешь Хаскель потому что тебе вставляет beautiful concurrency, например, и тебе лишь нужно уточнить технические моменты, но ни в коем случае не его не следует читать как введение в язык программирования.
RWH - это как уроки литературы в школе. Как бы ни были охуенены Толстой и Достоевский, после школьного вытраха мозга тупытыми сочинениями ты будешь русскую классическую литературу еще лет 5 ненавидеть, пока не попустит. Потому что вместо того чтобы учить наслаждаться красотой слога и стиля, тебя заставляют писать какую-то хуйню на тему что имел ввиду автор, Андрей и Дуб, блядь, тварь я дрожащая, или залупа коня Будулая. Делают они это на голуом глазу, будто так и надо, совершенно упуская из вида, что художественная литература - это интертеймент, это Голливуд 19-го века. Вот какой мудак станет на полном серьёзе искать острый социальный подтекст в фильме "Трансформеры"? Не, он там наверняка есть, но фильм-то смотрят чтобы покайфовать, заценить спецэффекты, получить, прежде всего, эстетическое удовольствие. Если для полного эстетического удовольствия нужно, чтобы автор затронул какие-то философские либо политические струнки, то в хорошем кино это тоже безусловно есть, иначе фильм покажется тупым, неинтересным. Но, прежде всего, фильм - это интертеймент. Вот и с RWH - та же хуйня. В RWH выхолощенный Хаскель. А кому он нахуй такой нужен? Хаскель изучают ради кайфа, ради зигохистоморфных препроморфизмов. Ведь для кастратов есть Джава, которая ни чуть не хуже в этом плане.
>>460770
Нет, он не устарел. В Хаскеле вообще всё заебок с обратной совместимостью, поэтому и знания десятилетеней давности не назовёшь малоактуальными. Проблема не в устаревании, а в подаче материала. RWH уныл. Прочитав RWH сложится лишь одно впечатление: "а нахуя мне Хаскель, я бы мог сделать это и на Джаве.." Т.е. чисто в техническом плане с RWH всё заебок, но он не даёт никакой эстетики абсолютно. За эстетикой нужно гнать в functional pearls, typeclassopedia для начала, чтобы понять, как математические абстракции могут реифицироваться в языке программирования, и словить от этого кайф. Вот тогда язык будет изучать интересно и приятно. А нахуй его учить по техническому мануалу RWH - вообще не понятно. Это имело бы смысл, если бы ты был ссаным школьником, который через силу учит востребованный рынком ЯП чтобы устроиться на работу. Но Хаскель рынком нихуя не востребован, его учат не ради того, чтобы батрачить, а ради того, чтобы поймать кайф, которого в RWH нет. Поэтому RWH не нужен, я считаю. Ну или нужен чисто как технический справочник, если ты уже решил что хочешь Хаскель потому что тебе вставляет beautiful concurrency, например, и тебе лишь нужно уточнить технические моменты, но ни в коем случае не его не следует читать как введение в язык программирования.
Ах ты засратый подхалим! Всем изветсно, что это переделанная паста из музыкача. Я, Стасик, снизойду до тебя, чтобы провести аппликивным функтором по твоей монаде, а также отметить, что переделку паст я не котирую. Я люблю оригинальный контент, вроде этого http://pastebin.com/WP1zGZKX восхваляющий мою скромность и величие, а с музыкачем, это в /mu/
>Awodey, Category Theory
Пидорство ебаное.
Постоянно пиздит про универсальное свойство, но ни разу не объясняет что это такое.
Рисует стрелочки с разными хуйнюшками-завитушками - опять же нигде не объясняется что они означают. Странички с обозначениями конечно же нет - зачем, ведь все и так уже в теме.
>Постоянно пиздит про универсальное свойство, но ни разу не объясняет что это такое
Да потому что нет такого понятия "универсальное свойство". Этими словами называют любую диаграмму, которая определяет что-то (с точностью до изоморфизма). Есть более конкретные понятия, например сопряженные функторы. Часто русуют диаграмму, которая эквивалентна сопряжению, а потом называют это универсальным свойством.
> стрелочки с разными хуйнюшками-завитушками
'>->' для мономорфизмов, '->>' для эпиморфизмов, и всё пожалуй.
http://nlab.mathforge.org/nlab/show/universal+construction
Еще раз, есть представимые функторы, пределы, копределы, сопряженные функторы, и т. д. Понятие "универсальное свойство" не нужно. Его использует Бурбаки, но просто потому, что чисто исторически не упоминает слов "категории" и "функторы", даже когда это целесообразно.
Ты хоть читал, что там написано-то?
> every single one of these is a special case of every other, so somehow one single concept here comes to us with many different faces.
И после этого ты будешь говорить
> Понятие "универсальное свойство" не нужно
рипс-лаовай?
Это неформальное понятие. Заметь, в nLab нет никакого определения "универсального свойства". Потому что придумывать такое определение нахуй не нужно. Но можно неформально называть что-то универсальным.
> в nLab нет никакого определения "универсального свойства"
В nLab вообще мало строгих определений. В основном неформальные конспекты.
Бизнес-интеграцию. Скоро буду себе замену искать, кстати. В ДС студентота с зайчатками хаскеля подошла бы.
Зависит от того, что ты у него спросил.
Многие, кто слышал про Haskell,
зацепили краем уха страшное слово,
всенепременно, у всех программистов,
ассоциируемое с Haskell'ем -- монады.
Но это всё фигня.
Посмотрите на комонады, сопряжённые функторы,
расширения Кана и braided моноидальные категории.
http://hackage.haskell.org/package/category-extras
Скажу по секрету, что это совсем даже и не ужас,
бывает и ещё гораздо страшнее, очень-очень страшное!
Дети, бойтесь Haskell'я, обходите его стороной!
Я тебе клоун, душкин какой что-ли, развлекать тебя? Сам разберешься, если гуглить умеешь.
лови жопных сёрферов.
https://www.youtube.com/watch?v=1aQldvK3Y1A
> Обработка изображений делается
Возможно вы имели в виду:
Автоматизация синтаксического шума на пробрасывание контекста и связывание вычислений для вещей, которых тебе понадобится пару десятков строчек. А в реализации низкоуровневых базисных вещей, которые ты будешь вызывать и комбинировать в этих строчках, всё будет переобмазано ST и уёбащным циклами и Ref'ами, которые можно было написать в 100 раз короче на любом скрипте, а потом эти пару функций написанных в монаде обработки изображений будешь тягать из IO, которого будет сотни строк, над каждой из которых ты будешь задумываться какой сорт бинда в ней сделать, и которое будет в 1000 раз бойлерплейтнее чем на любом скрипте.
Андрюша, не буянь
Ты просто не умеешь готовить Haskell
Очень похоже на описание кода программы в конце книги Холомьева, которую тут время от времени советуют.
[code]
readlines filename = do
content <- readFile filename
let filelines = lines content
return filelines
[/code]
как теперь это попринтить с помощью putStrLn?
волки в овечьих кудрях, змеи в белых перьях
я всем отдал по лоскуту своего наряда
я стою голый, я не верю... своему веселью
нельзя плакать, нельзя смеяться, нельзя
в глазах равнодушие... за глазами агрессия
кому продать свою девственность и в придачу себя?
приобретаешь свободу, а на сдачу - сумасшествие
я выхожу из себя
и не нахожу дорогу обратно
я не в себе давно уже
а в ком - мне до сих пор не понятно
сменяю одно заблужденье другим
я понял, это и есть чертово взросление
я вылез из кокона, первые сделал шаги
но где мои крылья? я гусеница, как и прежде
сколько есть у меня времени все взвесить?
сколько еще подтанцовывать внутренним бесам?
для мудрого – всё страдание, а любой поступок - зло
падающему улыбнитесь. Станислав Никто
алехин
бытие и абсурд, общество потребленья, паранойя
взросление, порнография, желанье стать новым ноем
раздавая конфеты бабам, постегаю прикладное христианство
все по кругу, где черта между покоем и блдством?
моя мысль летела вниз по лестнице и далее
мир насквозь, к манящим звездам женских гениталий
бутылка выпила меня целиком, я полетел за окурком
пока не споткнулся о пистолет этого придурка
я вас всех видел в гробу в белых тапочках!
можете жрать свое говно, я слишком талантливый!
вы все сор, вы пыль! а я король-самоубийца
я зажмурил один глаз, чтобы гондон этот не двоился
что ты орешь, "кто вы"? я с тобой тут один
засунь себе в жопу этот пистолет, кретин
вопи, что хочешь, но ты не разбудишь вселенную
умри или живи со своим членом среднего размера
но у меня уже не будет детей и сверхурочных
не взорвется в метро сосед, который много дрочит
мой крик застыл в глотке в поисках рта
не сосите вхолостую. Евгений Пустота.
волки в овечьих кудрях, змеи в белых перьях
я всем отдал по лоскуту своего наряда
я стою голый, я не верю... своему веселью
нельзя плакать, нельзя смеяться, нельзя
в глазах равнодушие... за глазами агрессия
кому продать свою девственность и в придачу себя?
приобретаешь свободу, а на сдачу - сумасшествие
я выхожу из себя
и не нахожу дорогу обратно
я не в себе давно уже
а в ком - мне до сих пор не понятно
сменяю одно заблужденье другим
я понял, это и есть чертово взросление
я вылез из кокона, первые сделал шаги
но где мои крылья? я гусеница, как и прежде
сколько есть у меня времени все взвесить?
сколько еще подтанцовывать внутренним бесам?
для мудрого – всё страдание, а любой поступок - зло
падающему улыбнитесь. Станислав Никто
алехин
бытие и абсурд, общество потребленья, паранойя
взросление, порнография, желанье стать новым ноем
раздавая конфеты бабам, постегаю прикладное христианство
все по кругу, где черта между покоем и блдством?
моя мысль летела вниз по лестнице и далее
мир насквозь, к манящим звездам женских гениталий
бутылка выпила меня целиком, я полетел за окурком
пока не споткнулся о пистолет этого придурка
я вас всех видел в гробу в белых тапочках!
можете жрать свое говно, я слишком талантливый!
вы все сор, вы пыль! а я король-самоубийца
я зажмурил один глаз, чтобы гондон этот не двоился
что ты орешь, "кто вы"? я с тобой тут один
засунь себе в жопу этот пистолет, кретин
вопи, что хочешь, но ты не разбудишь вселенную
умри или живи со своим членом среднего размера
но у меня уже не будет детей и сверхурочных
не взорвется в метро сосед, который много дрочит
мой крик застыл в глотке в поисках рта
не сосите вхолостую. Евгений Пустота.
show для String не умеет в уникод.
splitAt?
что курил?
а как теперь у putStrLn указать произвольную кодировку? У меня он по дефолту в cp866 печатает
>Для того, чтобы экспериментировать с архитектурными решениями
Т.е прогу свою с гуем я точно не запилю и начинать с хаскеля как первого языка точно не следует ни в коем случае? только не ржите, я реально не понимаю, единственное что меня интересовало - написание своих VST, но они все на C++ пилятся.
> Т.е прогу свою с гуем я точно не запилю
Ну почему нет, посмотри, например, как в elm'е это сделано.
Будто бы в хаскеле нельзя точно так же сделать.
Есть ли способ узнать на хакедже какие пакеты используют этот пакет? Или может быть кто-то знает проекты где это используется?
>Есть ли способ узнать на хакедже какие пакеты используют этот пакет?
http://packdeps.haskellers.com/reverse
но он чойта лежит сейчас
В общем ближе к сути. С чего с начать? Там книжку посоветуйте или читать документацию и вникать самому лучше?
В LISP, Forth, Nemerle с помощью макросов можно создать свой язык программирования с каким угодно синтаксисом. В Haskell такое возможно? Как там вообще обстоит дело с метапрограммированием?
Учитывая, что у неё 115 скачиваний за всё время, результат более чем ожидаемый. Кошерное кметоёбство - это линзы. Вот эта штука https://hackage.haskell.org/package/algebra тоже более-менее юзабельна как замена стандартным моноидам или numeric-prelude.
>С чего с начать?
С того, чтобы написать программу. По учебникам ЯП нет смысла учить, это же тебе на матешка в ВУЗ-е для экзамена, а чисто прикладная вещь. Все учебники примерно одинаковые в том плане, что покрывают какой-то объем материала +-, при этом ни в одном из них не будет всего, и ни один не гарантирует, что там будет именно то, что тебе надо. Поэтому просто бери и пиши, попутно гугля как сделать в Хаскеле какую-то нужную тебе вещь. Если чувствуешь, что много незнакомых слов, можешь читнуть отдельные главы, чтобы разобраться, но не наоборот.
>>469700
Можно (есть TH) но не нужно. Язык не про макросодрочесрство, а скорее напротив, про предоставление достаточно сильных абстракций, чтобы через них эффективно выражалось большинство задач без переизобретения языка.
Нужна программа для перехвата предварительных заказов, такси везет СПб
Такое возможно?
вроде в спринге были какието перехватчики, советую посмотреть
ghc
Борщ должен быть действительно хорош. Ты уверен что справишься?
Протопируешь на рельсах - переписываешь на хаскель, что не нравится.
заебешься
С хуя ли хаскель такой сложный? Он же наоборот в разы проще любой ооп-параши. Алсо, идите на хуй со своим теоркатом, мунады можно понять и без. Они банально представляют некий паттерн.
Например монада позволяет форсировать последовательность вычислений/вызовов и собирать ошибку без горы if-else и всяких экзепшонов. Смотрим сраные законы, интерфейс класса и примеры применения, больше ни хуя же не надо.
Теперь вспоминает талмуд gof, талмуд с правилами ооп для каждого конкретного языка, необходимость учить интёрналы. Блядь, да это же пожирание времени на хуйню.
Учите короче сишечку, хаскель, ffi и пердон с башем для всяких мелочей. Рельсы с рубями вставьте в анус быдлокодерам.
У тебя просто тупой какой-то вопрос. Для рельс написано столько гемов, что из них можно сразу готовый бейскэмп собрать, условно говоря. Для хачкеля написано примерно нихуя, поэтому все придется пердолить вручную и займет это в 20 раз больше времени.
Покажи хоть один веб-проект на хачкеле сложнее гостевухи.
Вот как раз такие дауны без минимального алгебраического и теоркат бекграунда в результате заглатывают с проглотом, когда продвигаются дальше, со своим макачьим пониманием на уровне "ну манадада ыта такой контейнер короч".
Если понимать теоретическую часть, то ненужно никаких макачьих интуитивных определений типа "некий паттерн", всё просто выстраивается в красивую, структурированную и простую модель и дальнейшие абстракции вроде комонад, пучков, линз и т.д. аккуратненько на неё ложатся.
Но судя по моим наблюдениям современный программист настолько деградировал, что способен усваивать информацию только со стековерфлоу и из бложиков со смищными картинками. Взять те же монады, - простейшая вещь, для понимания достаточно знаний алгебры за 9й класс и базовых знаний теоркату, которые можно получить за пару вечеров за учебником. Но 90% попробовавших вкатиться в хаскель ниасиливают даже это, и им на помощь спешит служба поддержки даунов с Функторы, аппликативные функторы и монады в картинках. Прочитав подобный высер очередной Раджеш думает что всё понял "аааа, так эта просто такой паттерн как в джява", это блять "такая коробочка для хранения контекста" и прочее говно. Нет господа, до тех пор пока вы будете мыслить по шаблонам как императивный джява слесарь, без капли абстрактного мышления, вы будете сосать хуй в хаскеле. Это язык для тех, в ком умер логик-алгебраист, а не для перекладывающих кирпичики имбецилов-инженегров. Идите нахуй.
>У тебя просто тупой какой-то вопрос.
Что в нём тупого? Я спросил чем Yesod хуже рельсов, ты не смог ответить.
>Для рельс написано столько гемов
А для джавы написано еще больше, что дальше?
>все придется пердолить вручную и займет это в 20 раз больше времени
Что именно придётся пердолить вручную?
>Покажи хоть один веб-проект на хачкеле сложнее гостевухи.
Что-то ты совсем опустился. Ну ладно, покажу: https://www.fpcomplete.com/
Потому что не думаю, что настоящие логики-алгебраисты (во всяком случае публикующиеся в JoA и других топовых журналах) увлекаются хаскелем или программированием вообще.
Будущий логик-алгебраист вполне может увлекаться
>ты не смог ответить.
Я другой анон.
>А для джавы написано еще больше, что дальше?
Значит на джаве тоже быстро написать получится.
>Что именно придётся пердолить вручную?
Примерно все.
>(управление проектами, пользователями, их доступом и профилями, таски различного вида, обсуждения, аттачи, действия с условиями (например, перебросить задачу на кента, оставить себя в наблюдателях)
Авторизация пользователей, права доступа, обсуждения, аттачи – для всего этого уже есть гемы – devise, cancancan, acts_as_commentable, paperclip. Это готовые, проверенные временем решения с подробной документацией как этим пользоваться.
На хаскеле большую часть придется писать вручную.
Ну ладно, хоть один проект нашелся.
>Я другой анон.
Ты взял на себя ответственность влезши сюда со своими гемами.
>Значит на джаве тоже быстро написать получится.
Не значит.
>Примерно все.
Что именно?
>Авторизация пользователей, права доступа, обсуждения, аттачи – для всего этого уже есть гемы
Для Yesod тоже есть, кроме того, если человек решил переписать basecamp, значит то что есть его не устраивает.
>Ну ладно, хоть один проект нашелся.
Демагог хуже хохла.
Я учу вышку и понимаю её значимость, но для начала программирования на хаскеле это всё нинужно. Я ведь начал как-то с пыхапе/паскалей/васиков/ассемблера 6502 я серьёзно будучи ещё совсем идиотом. Программы писались и как ни странно работали, а навыки, опыт и понимание как сделать лучше и чище постепенно наращивались сами со временем. Вот я и говорю что с хаскелем можно начать и так.
И монада нихера не контейнер. Это абстракция вызова одной функции из другой, из-за которой эти функции зависят друг от друга в некотором порядке, что гарантирует порядок их вычисления. И чистоту не нарушили, и проблему решили. А теоркат засуньте себе в сраку.
в каком порядке произойдёт вычисление этих 2х строчек?
ответ обоснуй
...
a <- Just a
b <- Just b
...
Гумманитарий вкатился в тред.
Ты довольно точно описал меня, поэтому реквестирую помощи в изучении
>базовых знаний по теоркату, которые можно получить за пару вечеров за учебником.
Аводея вроде советуют http://www.amazon.com/Category-Theory-Oxford-Logic-Guides/dp/0199237182
Я читал categories for the working mathematician
[code]
(Just a) >>= (\a -> (Just b) >>= (\b -> ... ) )
[/code]
Ленивое вычисление будет сначала выводить значение слева от >>= так как a требуется в выражении справа. Just a вычислится первым.
Раскроем ещё более детально:
[code]
(Just a) >>= f = f a
[/code]
a и f требуется знать по отдельности до того как вычислится f a. Вывод f перед аппликацией f a не будет раскрывать внутри себя (Just b) пока оно не потребуется явно. То есть в любом случае первым выстрелит a внутри (Just a), а затем внутренности f, где ожидает (Just b).
>взял на себя ответственность
Взял. И ответил.
>Не значит.
На рельсах всяко быстрее получится чем на джаве, но в любом случае скорость разработки напрямую коррелирует с количеством готовых решений.
>Что именно?
Перечислил часть списка с конкретными названиями гемов.
>Для Yesod тоже есть
Приведи примеры.
>если человек решил переписать basecamp, значит то что есть его не устраивает
Будто basecamp делали на перечисленных мною гемах. Я пример привел, basecamp был написан тыщу лет назад и возможно там все по-другому. Даже если и так, мало соединить эти гемы, чтобы получить точную копию basecamp'а. Вообще, судя по этой твоей цитате – ты вообще ничего не знаешь о веб-разработке.
>Демагог хуже хохла.
Ты же не будешь спорить с тем, что веб-проектов на хаскеле практически не существует? Круто что ты привел в пример web-ide для самого же хаскеля, проект финансируемый богатым хаскеледрочером, но как-то неубедительно.
Лол нет, конечно. Не ожидал что вопрос окажется таким сложным.
Не представляю как можно стать таким же невероятным задротом как Олег.
Может это на самом деле какой то коллективный конструкт типа Бурбаки или там Холовойчука?
Нету
Потому что такие книги пишут стивы макконеллы и прочие аджайл консультанты, а они пока в фп не заинтересованы.
Bitches dunno bout my let and where!
Есть джва листа с парами чисел, типа вот таких:
[[(-171,-59)],[(-129,37)]]
[[(3,155),(104,240),(177,157),(173,0)],[(4,44),(33,64),(76,62),(94,23),(85,47)]]
Количество подлистов всегда совпадает в обоих.
Как мне из второго листа добавить все элементы подлистов в соотв. им подлисты в первом?
Хочу получить такое:
[[(-171,-59),(3,155),(104,240),(177,157),(173,0)],[(-129,37),(4,44),(33,64),(76,62),(94,23),(85,47)]]
Зачем тебе?
https://anton-k.github.io/ru-haskell-book/book/toc.html
http://www.stephendiehl.com/what/
Нет, «Haskell by Example» не завезли
https://www.fpcomplete.com/school/starting-with-haskell/haskell-fast-hard
Все примеры можно тут же в онлайн-IDE потыкать.
Вроде нет. Не вижу ссылки на ftp. И про буддизм как то не задорно совсем.
Лучше на Go же.
Так вот пришел я сюда, чтобы совета просить, может чего по теоркату или алгоритмам каким почитать чего. А может проще перейти на skala, вроде как и куча библиотек, да и говнокодить проще но от синтаксиса все таки подташнивает, после хаскеля то
Ах да, забыл уточнить. Основную боль, унижение и депрессию haskell принес мне при написании gui под windows кого я обманываю, я даже библиотеки собрать не смог. Ну и при скачивании видео с ютуба, приходится дергать питоновский скрипт.
Чертова макаба похерила спойлеры.
1 - (4415, 3, 8)
2 - (44159, 6, 7)
3 - (44, 4, 9)
4 - (441, 3, 5)
Тогда:
441 - соответствует 4-му элементу
4415 - соответствует 1-му элементу
44159 - соответствует 1-му элементу
441599 - соответствует 2-му элементу
44159999 - соответствует 1-му элементу
441599999 - соответствует 3-му элементу
4416 - соответствует 3-му элементу
Можно-ли на Haskell реализовать элегантное и быстрое по времени выполнения поиска решение задачи? Если нет, в сторону какого языка посоветуете смотреть? Спасибо.
>Книженции/статейки по проектированию/архитектуре/типовым решениям в фп/хачкиле в частности
Факториал не умеешь написать?
Ты говоришь о поиске подстроки, либо о поиске по префиксу? У тебя все примеры с 44 начинаются.
>подстроки, либо о поиске по префиксу
Задача - по полному номеру телефона найти его префикс (ну или диапазон номеров). В общем случае полный номер может совпадать с префиксом.
>все примеры с 44 начинаются
Ну просто показал частные случаи, чтобы принцип поиска был понятен. Что угодно может.
>>490154
>джява
Спасибо. Уже есть решение на C#. JIT не нужен.
Собственно от Haskell ожидаю эффект как на пикче.
На пикче тормозит.
Ну да, тормозит. Суть не в этом, суть в том, что вместо кодинага на С#, фактически декларировать алгоритм. Очевидно, что сходу понять реализацию алгоритма на Haskell (если конечено знать его и вообще понимать ФП), гораздо проще, чем на С. Хотя бы потому, что код на Haskell существенно компактней. Относительно реалилзации моей задачи: сейчас множество префиксов представлено в виде дерева, где каждый узел - символ в префикса. Каждый уровень Узел может иметь до 10 ссылок на дочерние элементы (если кончено в использовать только цифры) и опционально макс. и мин. допустимое количество в полном номере (по которому собственно выполняется поиск). Тогда для множества, приведенного выше дерево вырождается в список из 5 узлов (да неудачный пример). Можно ли на Haskell (ну или Erlang) реализовать подобную структуру и алгоритм поиска?
Конечно можно, принцип точно такой же. И код будет компактнее, но далеко не факт, что напишешь ты его быстрее.
>не факт, что напишешь ты его быстрее.
Ну это я уже понял, ибо переключиться с императива на функциональность - это адский ад. Но надо, ибо мозги костенеть начинают.
>Задача - по полному номеру телефона найти его префикс
Префиксов сотовых операторов - несколько сотен. Даже самый тупой алгоритм, вроде сравнения с каждым из префиксов, будет работать.
>сотовых операторов
А я не говорил, что только сотовых операторов. Сейчас в базе вижу 21 тысчу записей телефонных префиксов.
Ну сформулируй тогда задачу так, чтобы можно было однозначно понять, что тебе нужно. Подозреваю, что реашается префиксным деревом, просто из твоего объяснения ничего не понятно.
Ну например префикс Челябинской области 7351 с минимальной длиной номера = 4, а Челябинска 73512 с минимальной длиной номера = 5 (для данного случая максимальная длина номера не ограничена, она используетя для коротких номеров и SMS-ок). Не смотря на то, что Челябинск в Челябинской области, для него выделен отдельный поддиапазон, который надо иднетифицировать по полному набранному номеру. И вот таких поддиапазонв в диапазонах может быть много, и теоретически уровней выделения поддиапазонв из поддиапазонов также может быть много. И даже больше, набранный номер может быть и не номером, а APN-ом, например "internet.beeline.ru" (но пока только цифры для простоты).
Кстати просто перебор может и не подойти. Например если набранный номер 73512 - то идентифицирован будет префикс Челябинсокй области. То есть тут пришлось бы запоминать последний "наилучший" вариант префикса и замещать его каждый раз когда будет найден еще более лучший "вариант".
берешь такой и сортируешь префиксы в лексикографическом порядке. Это будет массив префиксов.
После этого проходишь по номеру слева направа, берешь одну цифру, потом две и т.д.
Находишь первый и последний префиксы в массиве, которые начинаются с этих цифр. Бинарным поиском.
Если эти два префикса совпадают - то поздравляю, ты его нашел.
Если эти два префикса разные - то у тебя сужается диапазон поиска, берешь на одну цифру больше и ищешь опять.
Если таких префиксов нет, то номер ни из рахи
Если строки не нравятся, то можешь нулей дописать
Вот здесь есть реализация похожего на хаскелле http://nlpwp.org/book/chap-ngrams.xhtml#chap-ngrams-suffixarrays
>префикс Челябинской области 7351 с минимальной длиной номера = 4, а Челябинска 73512 с минимальной длиной номера = 5
Да, на самом деле тут три диапазона
[735111111,735119999] - Челябинская область
[735121111,735129999] - Челябинск
[735131111,735999999] - Челябинская область
а [7351,4] и [73512,5] - их компактное представление, которое становится еще более компактным в виде дерева, вырожденного в список [7,]-[3,]-[5,]-[1,4]-[2,5]
>>490515
Да, я понял тебя. Это похоже на поиск по дереву, но.
>берешь на одну цифру больше и ищешь опять.
Если префиксы представлять в виде дерева, то на каждой очередной итерции с новой цифрой, пространство поиска будет ограничено множеством дочерних узлов дерева. А здесь придется по всему диапазону каждый раз бегать.
Пиздец, тут нужна помощь не программиста, а аналитика. Этим я не хочу заниматься.
Да ладно тебе, с исходными данными понятно
7351XXXXX - Челябинская область
73512XXXX - Челябинск
735124XXX - допустим центр Челябинска
набранный номер 7-(351)-2-42-31 - попадает и в Челябинскую область и в Челябинск и в центр Челябинска, но идентифицирован должен быть именно как центр Челябинска. Тут как бы два уровня вложенности выделения поддиапазона из поддиапазона.
на шаге N у тебя есть min[n] и max[n], на шаге N+1
min[n] < min[n+1] <= max[n+1] < max[n]
так что одно и тоже, что и с деревом.
ах, забыл пояснить, что двоичный поиск же принимает в качестве аргументов min и max индекс
>>490722
Да, ты прав, на каждой итерации количество кол-во элементов для бинарного поиска уменьшается. Но в решении с деревом, на каждой итерации максимально количество элементов <= 10, то есть по количеству цифр. Значит время поиска по сортированному списку зависит от количества элементов в списке и от количества символов в набранном номере, а время поиска по дереву зависит только от количества символов в номере. Хотя реализация поиска по списку выглядит существенно проще. Спасибо за наводку, буду думать.
>>487883
https://wiki.haskell.org/Category:Idioms
если не можете что-то большое разбить на части — учите ооп
>А может проще перейти на scala, вроде как и куча библиотек, да и говнокодить проще
а ты знаешь java? в скале действуют те же принципы, что и в хаскеле, только ебаная система вывода типов и развитое ооп, с которым, очевидно, у тебя и проблемы.
> время поиска по дереву зависит только от количества символов в номере
нет, время поиска зависит от высоты дерева, а высота дерева зависит от числа элемнотов в нем.
Длина дерева никогда не будет больше длины номера (в отличии от длины списка). Его решение с деревом - эффективное и совсем несложное, зачем хуйню советуешь?
Я утверждаю, что они эквивалентны.
Дерево сложнее построить чем список, например.
> Длина дерева никогда не будет больше длины номера (в отличии от длины списка)
> Длина дерева
> Длина дерева
> Длина дерева
> Длина дерева
Если в номере n цифр, то максимальное колиечество префиксов, что в дереве, что в списке 10^n, сложность поиска логарифмическая что там что там, так что ассимптотически будет n. У дерева будет лучше константа, что компенсируется сложностью построения дерева.
Сложность поиска в дереве - константа (если точнее - O(N), где N - высота дерева), если оптимально для скорости делать.
Ну и для большинства практических применений дерево будет строиться один раз, а номера искаться - много раз.
Это да.
Но сам бинарный поиск же - логарифм от кол-ва префиксов, если препроцессинг не делать.
в дереве тоже переход на следующий уровень не константа.
Хотя, ладно, уговорил, получается O(N log N) для массива.
Константа, если памятью пожертвовать. Делать в каждой ноде массив из 10 ссылок/указателей/Maybe и проверять сразу для нужной цифры - есть там что или нет.
Ну если длина набранного номера 5 символов, то ниже 5 уровня по дереву прохода не будет. Хотя высота дерева может быть больше.
[code lang=haskell]
data PrefixTree a = PT (Map a (Maybe (X a), PrefixTree a))
findX :: PrefixTree Int -> Int -> [Int] -> Maybe (X Int)
findX _ _ [] = Nothing
findX (PT tree) len (x:xs) = do
(v, tree') <- M.lookup x tree
findX tree' len xs <|>
mfilter (flip inRange len . range) v
[/code]
Как-то так будет. Сейчас в метро. Доберусь до компа — напишу нормально.
Мозг ломаешь мне. Хотя я этого и ожидал. На Erlang-е, я так понимаю, синтаксис будет примерно такой-же. Судя по его особенностям и моим задачам - он мне больше Haskell-я подходит.
Лисп тоже динамикодрисня, но его тут уважают.
На самом деле у борщехлебов бомбит от того, что на Erlang можно зарабатывать деньги, а на их лиспах/хаскелях - нет.
это статикодебилы, чего ты хотел?
С разбиением большого на малое проблем у меня не возникает
>учите ооп
Да, уже поставил Visual Studio
Итак, узел дерева это кортеж, состоящий из: символ префикса, идентификатор префикса, минимальная длина номера, максимальная длина номера, список дочерних узлов-кортежей. Все параметры кроме символа префикса опциональны. Тогда, функция, выполняющая поиск по дереву должна принмать следующие параметры: список, содержащий символы набранного номера, текущую позицию символа, длину списка набранного номера (дабы не вычислять ее в каждом рекурсивном вызове) и собственно само дерево, по которому выполняется поиск.
%пустое дерево
prefix_find(_, _, _, []) -> 0;
%путой набранный номер
prefix_find([], _, _, _) -> 0;
%нулевая длина набранного номера
prefix_find(_, _, 0, _) -> 0;
%номер не соответсвует ни одному префиксу
prefix_find(_, N, PhoneLen, _) when N > PhoneLen -> 0;
%найден префикс, в которой может входить набранный номер
prefix_find(Phone, N, PhoneLen, PrefixTree)
when element(2, PrefixTree) /= 0 , element(3, PrefixTree) =< PhoneLen , element(4, PrefixTree) >= PhoneLen -> Id1 = element(1, PrefixTree),
1.
%Но поиск по дереву должен быть продолжен, так как номер может входить в другой, более "строгий" префикс
%То есть, необходимо найти в списке в списке кротежей element(5, PrefixTree) кортеж, первый элемент коорого равен list:nth(N, Phone)
Собственно как реализовать поиск по списку кортежей, с критерием поиска = значение первого элемента кортежа? Или в эрланге какой-нибудь Map есть?
Нахуй тебе энларг ё пенис? На нем не получится более лаконичного кода и сам он тормоз лютый.
>Нахуй тебе энларг
Масштабируемость, откзоустойчивость, многопоточность, высоконагруженность - вот это все.
>На нем не получится более лаконичного кода
Ну даже если он не будет таким лаконичным как на Haskell - ничего страшного.
>тормоз лютый
Личный опыт? Или может есть бенчмарки какие?
1. Код должен следовать принятым в сообществе best practices.
2. Код должен воплощать логику, обусловленную извне. Например, распознаватель капчи - годится, а parser combinator library - нет.
3. Я дочитываю RWH, написал несколько сотен строк кода. Из этого я понимаю абстракции по monad transformers включительно. Я хочу посмотреть, как на этих абстракциях пишут настоящие программы. Чем меньше мне придётся при этом познать новых абстракций, таких как GADT и lenses, - тем лучше.
>Чем меньше мне придётся при этом познать новых абстракций, таких как GADT и lenses,
Ну у тебя и запросы, братюнь. Один серьезный минус хаскеля в том, что эти абстракции незаметно липнут к тебе с течением времени, и к тому моменту, как студент начавший изучать хаскель по приколу пишет свой распознаватель капчи, его образ мышления обрастает линзами, шаблонами, стрелками и прочей квазиквотацией.
Это копия, сохраненная 30 июня 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.