1. Куча / Говнокод #19131

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    Del1 = fun(K,[A|B],F,Acc) ->
    if
    not(is_list(A)) and (B==[]) and (A rem K == 0) -> Acc;
    not(is_list(A)) and (B==[]) -> [A|Acc];
    not(is_list(A)) and is_list(B) and (A rem K == 0) -> F(K,B,F,Acc);
    not(is_list(A)) and is_list(B) -> F(K,B,F,[A|Acc])
    end
    end.
    D=[10,22,34,45,52,60,75].
    Del1(5,D,Del1,[]).

    Студент сдал по Функциональному программированию (написано на Erlang, работает).
    Функция удаляющая из списка эл-ты кратные 1му аргументу.

    Запостил: vt244, 04 Декабря 2015

    Комментарии (100) RSS

    • Про паттерн-матчинг ему никто не объяснял?
      И почему не в модуле?
      Ответить
      • Не в модуле т.к. поход уже "сдайте хоть чтото". Паттерн-мачинг давался на лекциях.
        Ответить
    • Как-то так, наверное:

      -module(foo).
      -compile(export_all).
      
      f1(X, L) ->
        [H || H <- L, H rem X /= 0].
      
      f2(_, [], Acc) ->
        Acc;
      f2(X, [H|T], Acc) when H rem X == 0 ->
        f2(X, T, Acc);
      f2(X, [H|T], Acc) ->
        f2(X, T, [H|Acc]).
      Ответить
      • Acc так же не необходим.
        Ответить
        • А как же хвостоаая рекурсия?
          Ответить
          • А зачем?

            -module(test).
            -compile(export_all).

            f1(_, []) -> [];
            f1(E, [H|T]) when H rem E /= 0 -> [H|f1(E,T)];
            f1(E, [_|T]) -> f1(E,T);
            f1(_,_) -> {error, bad_args}.
            Ответить
            • > А зачем?
              Чтобы функция не потребляла стек пропорционально размеру списка (в худшем случае), очевидно.

              Или у вас модифицированный, ленивый эрланг?
              Ответить
              • суровые эрлангисты иногда таки советуют жрать стек (пруфоф не будет)
                всё, якобы, тогда деаллоцируется разом, в то время как хвостовая функция оставит больше мусора на некоторое время, которое может привести к фризу VM, если дёргать подобные вещи периодически
                поскольку я модель управления памятью в эрланге представляю себе очень плохо, не могу сказать, правда это или вымысел
                Ответить
                • cleaned
                  Ответить
                • > иногда таки советуют жрать стек
                  Но таки юзают именно хвостовую в бесконечных циклах рекурсиях обработки сообщений.
                  Ответить
              • Спорное утверждение (с т.з. Erlang), что лучше, но не вижу смысла подымать холивар. Но т.к. задача по ФП (а хвостовая рекурсия там весьма боком) и т.к. тема звучала, как простая рекурсия - то данное решение подходит лучше.
                Вообще оба метода имеют право на жизнь, но в случае сложной рекурсии хвостовой пользоваться проблематично.
                Ответить
      • Не Эрланг. Не функционально. Без рекурсии.
        rem_mod_first(First, List, Result) :-
            findall(Y, (member(Y, List), 0 is Y mod First), Result).
        Ответить
    • Учить функциональному программированию на примере Erlang-а?
      Странный выбор.
      filterOutDivisible []     = []
      filterOutDivisible (x:xs) = x : filter (\i -> i `mod` x /= 0) xs
      Ответить
      • неистово плюсую
        эрланг убог, крив и не нужен
        Ответить
        • Ты просто не умеешь его готовить =)
          Ответить
          • он никак не наказывает тех, кто не умеет его готовить, и это тоже в нём плохо
            ну а мне за его готовку деньги платят, родной
            Ответить
            • мне просто интересно в качестве чего в продакшене используют Erlang?
              Ответить
              • телекомы-телекомчики
                в основном для контроля низлежащего сишкоблядского кода и высокоуровневых вещей
                Ответить
                • Супервайзеры, присматривающие за супервайзерами, присматривающими за супервайзерами, присматривающими за сишным кодом. Типичный код на эрланге.
                  Ответить
                  • ну супервайзоры в коде занимают меньшую часть (если не рассматривать клинические случаи)
                    самое ужасное -- это вау-эффект от лёгковесных процессов, приводящий к https://my.mixtape.moe/vdjgii.png
                    Ответить
                    • =) За картинку плюсую =)
                      Ответить
                    • Это же TIM2:)

                      А вообще да: каждый чих должен быть в отдельном акторе
                      Ответить
                    • mixtape.moe использует недействительный сертификат безопасности. К сертификату нет доверия, так как он является самоподписанным. Сертификат действителен только для cockbox.localdomain

                      Какой багор )))
                      Ответить
                      • >>> Веб-сайт mixtape.moe использует механизм HSTS. Открыть сайт в настоящее время нельзя. Сбой мог быть вызван сетевой ошибкой или действиями злоумышленников. Скорее всего, сайт заработает через некоторое время.
                        Именно поэтому я за «HSTS».
                        Ответить
                        • Что такое «cockbox»? Клетка для петухов?
                          Ответить
                          • Любительский (?) абузоустойчивый (??) приватный (???) хостинг от авторов https://cock.li/.
                            Ответить
                            • Yes! It appears that https://cock.li/ is currently blocked in Russia.

                              Domain cock.li
                              Decision 27-31-2019/ИД1139-19 made on 2020-02-06 by Генпрокуратура.

                              This block affects IPs 185.100.85.212, 2a06:1700:0:b::c0c, domain cock.li and URL https://cock.li.
                              IP 37.120.193.123
                              Decision 27-31-2018/Ид2971-18 made on 2018-04-16 by Генпрокуратура.

                              This block affects IP 37.120.193.123.
                              Decision 27-31-2019/ИД1139-19 made on 2020-02-06 by Генпрокуратура.

                              This block affects IP 37.120.193.123.
                              Ответить
                      • показать все, что скрытоvanished
                        Ответить
                      • показать все, что скрытоvanished
                        Ответить
                    • «Гугл» нашёл на этой странице такую картинку:
                      https://i.imgur.com/G4ns3dX.png

                      Это она?
                      Ответить
        • error language
          Ответить
      • Упс, спросонья прочитал "1му аргументу" как "1му элементу". Тогда так:
        filterOutDivisible d xs = filter (\x -> x `mod` d /= 0) xs
        Ответить
      • Почему Erlang? Потому что GCL совсем мертв, хотя лучше подошел бы... Если б был жив. Старался поживее язык дать.
        Ответить
        • > GCL

          define GCL
          Gnu Common Lisp?
          Guarded Command Language?
          Generic Configuration Language?

          > Старался поживее язык дать.
          Кмк, Scheme - отличная альтернатива. Как минимум есть сносная IDE в лице Racket. И отличная книга с отличным переводом в лице SICP. Ну и Guile - стандарт для расширений в мире GNU, на нём сейчас Guix пишут.
          Ответить
          • Gnu Common Lisp
            Ответить
            • ГНУ Коммон Лисп никогда не был жив по-настоящему (никогда не реализовал стандарт в полной степени). Зачем именно его использовать, когда другие, соотвестсвующие стандарту есть? Ну и Коммон Лисп как бы плохой пример функциональных языков вцелом, разве что для понимания истории интересно.
              Ответить
          • Scheme - отличная альтернатива. Не думаю, но любые взгляды субъективны.
            Ответить
            • > Не думаю
              > взгляды субъективны

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

              Я свои аргументы привёл, дальше дело ваше.
              Ответить
              • Аргумент для изучения ФП - это IDE что ли? IDE к ФП какое отношение имеет?
                Ответить
                • .... И отличная книга с отличным переводом в лице SICP. Ну и Guile - стандарт для расширений в мире GNU, на нём сейчас Guix
                  Ответить
                • > IDE к ФП какое отношение имеет?

                  Мы не рассматриваем ФП, а язык, на котором удобнее всего иллюстрировать использование ФП.

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

                  Да, наличие легко настраиваемой среды разработки - хороший довод в пользу выбора ЯЗЫКА для обучения, причём достаточно важный.

                  Наличие хорошей документации и литературы - ещё один довод в пользу ЯЗЫКА.

                  Наличие активных проектов с открытым исходным кодом - тоже неоспоримый плюс. Кроме того, схема имеет довольно много общего с Clojure, который тоже вполне "жив".

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

                  Недавно видел курсы Кичалеса на EDX, где использовалась схема:

                  https://www.edx.org/xseries/systematic-program-design-0
                  Ответить
                  • Как это вижу я. Еще 1 бесполезный язык в копилку. В догонку к бейсику и паскалю.
                    По среде. Моя основная рабочая среда (в зависимости от обстоятельств):
                    1) vim
                    2) mcedit
                    3) notepad++
                    Ну никаких проблем с ней нет за много лет работы.
                    По Erlang есть в достаточном объеме литература. Документация аналогично, нареканий не вызывает. Что касается среды, то она не ключевой момент с моей точки зрения, и иногда больше вредит.
                    По с++ - этот язык изначально ООП и только потом ФП, в отличие от Erl (или Scheme).

                    Я не сильно намерен холиварить. Дело каждого - по среде выбирать языку, по количеству книг или еще по чему то.
                    Ответить
                    • Страуструп говорит - мультипарадигменный.
                      Ответить
                      • мультипарадигменный только пхп остальные завидуют
                        Ответить
                        • > мультипарадигменный
                          В каком году в пхп классы и лямбды появились?
                          Ответить
                          • Да вроде давно уже.
                            Ответить
                            • Ну вот погуглил:

                              Зайчатки ООП - 4.0 (~2000 год)
                              Приват и протектед - 5.0 (2004 год)
                              Неймспейсы, лямбды - 5.3 (2010 год)
                              Ответить
                              • Кстати, немного боли.

                                2015-й год. С главной страницы php.net удалили ссылки на выпуски старше, чем 5.5. Т. е. официально поддерживаются только 5.5, 5.6 и 7.0.

                                На говнохостингах до сих пор зачастую 5.2 без лямбд и без неймспейсов.
                                Ответить
                                • Именно так. Правда, мне говорили, что могут 5.3 поставить. А еще у них сжатия нет
                                  Ответить
                                  • mod_gzip? gzip как-то в самом php можно активировать.
                                    Ответить
                                • наиболее популярные движки написаны на пхп 5.3. - 5.4. Конечно они будут работать на 5.5, но нет там всего богатства возможностей версий старше 5.5.

                                  Если взять какой нибудь Битрикс то там по моему и нейм спейсов нет.
                                  Ответить
                                • >На говнохостингах
                                  нахуя они нужны при наличии копеечных VPS?
                                  Ответить
                                  • 1. VPS надо настраивать, а на шаред хостинги файлы просто заливаются по ftp.
                                    2. Как они держат пиковую нагрузку?
                                    Ответить
                                    • В смысле резкую нагрузку когда юзер запрашивает страницу.
                                      Ответить
                                    • >> 1. VPS надо настраивать,

                                      Опять ты за свое. Ты пойми наконец: ни для кого кроме тебя и еще пары школьников "настраивать апаче" не является проблемой.
                                      Ответить
                                      • К сожалению, сайты держат зачастую люди, далёкие от программирования и даже от системного администрирования. Залить готовый движок на хостинг через ФТП они в состоянии, а для настройки VPS им придётся нанимать админа. К тому же на шаред хостингах бывает услуга установки этих ваших Джумлы или Друпала в один клик (т. е. даже самому качать и копировать не нужно).

                                        Хотя на некоторых VPS сейчас из коробки есть cPanel/ISPmanager/ещё-какая-нибудь-панелька, c помощью которых залить сайт не сложнее, чем на шаред хостинг.
                                        Ответить
                                        • > VPS сейчас из коробки есть cPanel/ISPmanager
                                          совершено верно.
                                          Поэтому нет никакого смысла юзать шаред хостинг тем более за него платить.
                                          Ответить
                                          • >cPanel/ISPmanager
                                            Что это такое?
                                            Ответить
                                            • Гуглится же.

                                              https://ru.wikipedia.org/wiki/Сравнение_панелей_управления_веб-хостингом
                                              Ответить
                                              • Крякнутая есть чтобы на vps накатить?
                                                Ответить
                                                • Не интересовался кряками, но можно подобрать что-нибудь из бесплатных.

                                                  Такие панели хороши, когда они предустановлены. Ставить самому есть смысл, только если ты собираешься поднять не один сайт (т. е. если ожидается, что трудоёмкость установки потом окупится), потому что панель управления сразу может и не завестись. Пхпмайадмин заводится сразу, потому что ему нужны только координаты подключения к базе и больше ничего, а тут в разных сборках ОС могут не совпадать пути к файлам и набор программного обеспечения, так что придётся сидеть и править конфиги.
                                                  Ответить
                                        • Да и домашнюю страничку на бесплатном хостинге запилить можно за 0 копеек. А если я школьник, студент или просто экономный человек и на мой сайт кроме меня никто не ходит, все остальные варианты -- однозначно пустая трата денег.
                                          Ответить
                                          • Ну за 0 копеек ты получишь гавно хуже чем на виртуалке за 1 бакс. Бывают нормальные шаред хостинги за бакс, а не лагающее гавно с выключенным гзипом?
                                            Ответить
                                      • Анонимный мудачок, такие как я среди людей которые ставят себе вёрдпресс или форум еще оччень неплохой вариант.

                                        >К тому же на шаред хостингах бывает услуга установки этих ваших Джумлы или Друпала в один клик (т. е. даже самому качать и копировать не нужно).
                                        Ответить
                              • И тут жава соснула.
                                Ответить
        • Для понимания принципов и традиции функционального программирования я бы использовал ОКамл по следующим причинам:
          1. Простой синтаксис (вотличие от Хаскеля, например).
          2. Теория типов, которая исторически связана с функциональными языками освещена в деталях (вотличие от Схемы, например). Более того, запись типов в диалектах МЛ очень похожа на их математическую запись (что не обязательно хорошо, но поможет студентам сориентироваться), например, тип списка записывается так же как свободный моноид из алфавита элементов списка, тип функции, или коретжа выглядит очень похоже на математическую запись типа функции или кортежа и т.д.
          Ответить
          • > Простой синтаксис (вотличие от Хаскеля, например).
            Лолчто? В OCaml гораздо больше (раз в 4-5) различных синтаксических конструкций и их комбинаций. Ещё и ООП сбоку прикручено, правда, им мало кто пользуется.

            У меня есть персональная лакмусовая бумажка простого синтаксиса: если я через полгода перерыва могу спокойно писать на языке код, не заглядывая в книжку для уточнения синтаксиса - синтаксис простой. Если не могу - синтаксис сложный.
            Так вот, на Haskell и Go после перерыва (мне) писать легко, а на OCaml и Scala - очень сложно (если это не хелло-ворд, конечно). Я вот даже сейчас с трудом могу вспомнить, как в OCaml правильно записываются полиморфные типы с несколькими параметрами, нужно в доку лезть.
            Ответить
            • В брейнфаке еще меньше конструкций, но я бы не сказал, что синтаксис в нем проще для понимания. В ПХП конструкций и ключевых слов еще больше, но я бы не сказал, что ПХП сложный для понимания. В Хаскеле синтаксис плохой потому что:
              1. Нужно прочитать очень много контекста, чтобы понять то, что написано. Например, чтобы догадаться, что какие-то закорючки внутри строковых литералов будут особенным образом интерпретироваться нужно найти соответствующую {-# ... #-} инструкцию где-то х.з. где.
              2. Грамматика очень свободная. Например: а б ц д - это код на Хаскеле, но можно только догадываться, имеется ли в виду ((а б) (ц д)), (а (б (ц д))) и т.д.
              3. Программисты очень часто используют сложные / ненужные возможности языка (например, в Лиспе есть ридер макросы и символ макросы, но используют их крайне редко). Аналогично С++, где программисты любят использовать ненужные возможности языка просто потому, что они в нем есть.

              А субъективно - ну вот я не пишу много на ОКамле, очень редко, когда мне нужно дать пример типичного функционального подхода - и я не испытываю сложностей при чтении программы. И в то же время чтение программы на Хаскеле для меня - это то же самое, что решать судоку, т.е. мне ее нужно переписать на что-то вменяемое, чтобы понять.
              Ответить
              • > {-# ... #-} инструкцию где-то х.з. где
                Все языковые расширения всегда пишутся в начале файла.

                > Например: а б ц д - это код на Хаскеле, но можно только догадываться, имеется ли в виду ((а б) (ц д)), (а (б (ц д))) и т.д.

                Это всегда означает применить функцию а к параметрам б, ц и д. Синтаксис вызова функций в OCaml такой же.

                Ну разве что один из аргументов в обратных кавычках - тогда он работает как оператор с дефолтным приоритетом 7.

                > Нужно прочитать очень много контекста
                Когда я читал чужие исходники, сложнее всего было понять, откуда появляются функции, потому что люди почему-то не любят квалифицированные импорты. Но это не синтаксическая проблема, а семантическая. В OCaml тоже так можно навредить, переборщив с open Module
                Для себя эту проблему решил явной квалификацией всех импортов во всём коде, который пишу.
                Ответить
                • Это, конечно, хорошо, но хаскель не нужен. То есть, он только для баловства годится, как практика по теории типов, например, или просто как забавная головоломка в свободное время. Все "реальные проекты" на хаскеле, которыми некоторые любят гордиться, не смогли хоть как-то развиться из-за сложности языка. Почему-то не получаются на хаскеле большие сложные системы.
                  Ответить
                  • > не смогли хоть как-то развиться из-за сложности языка

                    Не согласен.

                    У меня есть теория - когда люди пишут на "красивом" (не важно, что они понимают под этим словом) языке, они зачастую ожидают, что почти у всех задач есть "красивое" решение на этом языке.

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

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

                    Когда люди пишут на хаскеле на работе за деньги, они, безусловно, сталкиваются с множеством проблем, но в целом очень довольны выбором языка.
                    Ответить
                    • > люди не знают, как сделать "красиво", а "некрасиво" им мешает убеждённость во врождённом превосходстве инструмента
                      Хм, т.е. PHP, по сути, идеальный язык. Никто не ждёт от кода на PHP чего-то красивого, поэтому на нём можно написать сложный проект.
                      Ответить
                      • > Хм, т.е. PHP, по сути, идеальный язык.

                        You've got the idea.

                        Да, что-то вроде этого. Никто не ищет красоты, просто намазывает тёплый функционал слой за слоем, в итоге получая что-то более-менее работающее, потом щедро сдабривает костылями и выставляет наружу модный РЕСТАПИ.
                        Ответить
                        • Отсутствие необходимости в компиляции, дает возможность "подпереть распорками" код в продакшене не останавливая сервер.
                          Ответить
                          • Ага, прямо в продакшене. Вы пхпшники реально Богом обижены
                            Ответить
                            • на ГК зеленый цвет по дефолту включен :)
                              Ответить
                              • ...а также мозг гостя по дефолту выключен
                                Ответить
                              • Ну просто ПХПшники ведь и правда такчасто делают
                                Ответить
                                • и не только пехепешники.
                                  Ответить
                                  • да, JSники еще)

                                    Так что в каждой шутке есть доля шутки
                                    Ответить
                    • Чтобы найти хаскелистов, нужно места знать. А по сторонним форумах ходят ньюфаги в основном.
                      Ответить
                      • /s/ на имиджбордах... Там ты найдёшь кучу хаскелистов, готовых работать за чашку борща.
                        Ответить
                        • Почему не в /pr/?
                          Я имел ввиду другое, на имиджбордах одни говноеды.
                          Ответить
                          • > почему не в /pr/
                            Потому что я лоханулся, привык к доброчановским /lor/ и /lisp/.
                            Ответить
                            • >/lor/
                              Што?
                              Ответить
                              • Да у доброчанек названия разделов нестандартные ;(
                                Ответить
                                • Как раздел назовешь, так он и поплывет. Назовешь лором - будут там сидеть прыщеуебаны.
                                  Ответить
                                  • Да можно подумать, что на дваче харкаче концентрация прыщеуебанов меньше...
                                    Ответить
                                    • До введения модерации и пока карманов писал в бложек все было по-другому.
                                      Ответить
                        • Работать они не готовы, они только писать хуйню и выебываться могут.
                          Ответить
                  • После вот такого говна в стандартной либе OCaml считается хорошим?
                    let rec map f = function
                        [] -> []
                      | a::l -> let r = f a in r :: map f l
                    Ответить
                    • > простой синтаксис, в отличие от хаскеля, например
                      Ответить
                    • Но ведь в стандартной библиотеке Haskell такое же определение!
                      Ответить
                      • Не всё так просто. http://rsdn.ru/forum/decl/4519667.1
                        Ответить

    Добавить комментарий