• Шесть парадигм программирования, которые изменят ваш взгляд на код

    • Перевод
    Периодически я натыкаюсь на языки программирования, которые настолько самобытны, что меняют моё представление о коде в целом. В этой статье я хотел бы поделиться некоторыми из самых любимых моих находок.

    Здесь вы не найдёте устаревшего посыла «функциональное программирование спасёт мир!»; мой список состоит из куда менее популярных наименований. Готов поспорить, многие из читателей вообще не слышали о большинстве языков и парадигм, о которых пойдёт речь, так что надеюсь, вам будет так же интересно с ними разбираться, как и мне.

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


    Читать дальше →
  • О том как создать простое Scala SBT-приложение для Android

    Доброго времени суток, друзья. Занимаясь разработкой инструментов для разработчиков, я столкнулся с вопросом о взаимодействии вышеупомянутых инструмента, языка программирования и платформы. Если первые две сущности просто созданы друг для друга (SBT — основной, наиболее часто используемый build tool для разработки на Scala), то их применимость для платформы Andriod не является чем-то само собой разумеющимся. И тем не менее, в огромной и постоянно развивающейся индустрии ПО складываются и такие ситуации, когда данный набор технологий будет рациональным выбором. Вопрос — когда данный выбор рационален, не является предметом данной статьи. А расскажу я именно том, как это делать.

    Среда разработки


    Я исследовал применимость данного подхода для работы в Android Studio и IntelliJ IDEA. Для этой цели, значимой разницы в средах практически нет. Есть нюансы — с ними я вас ознакомлю по ходу статьи.
    Читать дальше →
    • +10
    • 4,1k
    • 8
  • Монадные трансформеры для практикующих программистов

    • Перевод

    Прикладное введение в монадные трансформеры, от проблемы к решению


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


    Всё как обычно: несколько лаконичных однострочных выражений (да, детка, это Scala!), несколько странных ошибок компилятора (о, нет, Scala, нет!), лёгкое сожаление о том, что вы написали такой запутанный код… И вдруг вы сталкиваетесь со странной проблемой: выражение for не компилируется. «Ничего страшного», — думаете вы: «сейчас гляну на StackOverflow», как вы это делаете ежедневно. Как все мы это делаем ежедневно.


    Но сегодня, похоже, неудачный день.


    Читать дальше →
    • +25
    • 8,4k
    • 8
  • Пишем свои монады на Scala на примере CSV-парсера

    • Tutorial

    За последнее время мы очень многое узнали о монадах. Мы уже разобрались что это такое и даже знаем как их можно нарисовать, видели доклады, объясняющие их предназначение. Вот и я решил заскочить в уходящий монадный поезд и написать по этой теме, пока это окончательно не стало мейнстримом. Но я зайду с немного другой стороны: здесь не будет выкладок из теории категорий, не будет вставок на самом-лучшем-языке, и даже не будет scalaz/shapeless и библиотеки parser-combinators. Как известно, лучший способ разобраться как что-то устроено — сделать это самому. Сегодня мы с вами будем писать свою монаду.


    image


    Задача


    Возьмем для примера банальную задачу: парсинг CSV-файла. Допустим нам требуется распарсить строки файла в case classes, чтобы потом отправить их в базу, сериализовать в json/protobuf и так далее. Забудем про escaping и кавычки, для еще большей простоты, считаем что символ разделителя в полях встречаться не может. Думаю, если кто-то решит затащить это решение в свой проект, докрутить эту фичу будет не трудно.


    Читать дальше →
    • +19
    • 5,2k
    • 9
  • Тонкости Scala: изучаем CanBuildFrom

    image


    В стандартной библиотеке Scala методы коллекций (map, flatMap, scan и другие) принимают экземпляр типа CanBuildFrom в качестве неявного параметра. В этой статье мы подробно разберём, для чего нужен этот трейт, как он работает и чем может быть полезен разработчику.


    Читать дальше →
  • Возвращаясь к Неразмеченным Конечным Интерпретаторам с Dotty

    Неразмеченные Конечные Интепретаторы (Tagless Final interpreters — прим. пер.) — это альтернативный подход традиционным Алгебраическим Типам Данных (и обобщённым ADT), основанный на реализации паттерна "интерпретатор". Этот текст представляет "неразмеченный конечный" подход в Scala, и демонстрирует каким образом Dotty с его недавно добавленными типами неявных функций делает этот подход ещё более привлекательным. Все примеры кода — это прямое переложение их Haskell версий, представленных в Typed Tagless Final Interpreters: Lecture Notes (раздел 2).


    Паттерн "интерпретатор" в последнее время привлекает всё больше внимания в сообществе Scala. Множество усилий было затрачено на борьбу с наиболее ярким недостатком решений, основанных на ADT/GADT: расширяемость. Для начала можно взглянуть на typeclass Inject из cats как на реализацию идей Data Type à la Carte. Библиотека Freek предоставляет средства для комбинирования более двух алгебр, используя украшения с задействованием аппарата операций на уровне типов. Решение, предложенное в работе Freer Monads, More Extensible Effects также ставит акцент на расширяемости, и вдохновлено набором небольших Scala-библиотек, таких как eff, emm и paperdoll. Неразмеченные конечные интерпретаторы подходят в некотором смысле с противоположной стороны, используя типы классов в своём непосредственном основании вместо более традиционных ADT/GADT. Они также поставляются с большим превосходством в расширяемости "из коробки" без каких-то явных опасностей.


    Читать дальше →
  • Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
  • Митап по Apache Spark

      image

      27 апреля на Мансарде RAMBLER&Co пройдет первый митап, посвященный работе с Apache Spark.

      Apache Spark уже успел зарекомендовать себя как один из основных фреймворков работы с большими данными и успешно применяется в таких крупных компаниях, как Amazon, Baidu, IBM, Databricks, NASA JPL и TripAdvisor. Нам известно, что и в России Spark используется во многих небольших и в некоторых крупных компаниях, причем весьма результативно.

      В Rambler&Co мы уже около года используем Spark почти для всех задач департамента рекламных технологий, связанных с ETL и машинным обучением. Более того, в начале года мы успешно обновились до версии 2.1.0.

      На митапе мы бы хотели поделиться нашим опытом внедрения Spark в продакшен, рассказать о проблемах, с которыми мы столкнулись, и обсудить решения, которые применили. Выяснить, какие новые и крутые фишки появились в Spark 2, и какие баги успешно мигрировали из предыдущих версий Ну и, конечно же, познакомиться с другими энтузиастами и практиками этого замечательного инструмента и сделать наше мероприятие регулярным! Приходите, будет интересно!
      Читать дальше →
    • Scala: parser combinators на примере парсера формул

        Время от времени у меня возникает желание придумать свой собственный маленький язык программирования и написать интерпретатор. В этот раз я начал писать на scala, узнал про библиотеку parser combinators, и был поражён: оказывается, можно писать парсеры легко и просто. Чтобы не превращать статью в пособие по "рисованию совы", ниже приведёна реализация разбора и вычисления выражений типа "1 + 2 * sin(pi / 2)".


        Сам парсинг и вычисление выражения занимают всего лишь 44 непустых строчки — не то чтобы я сильно стремился сократить их количество, но выглядит это реально просто и лаконично. Проект на github.


        Для сравнения:



        Итак, если вам не терпится увидеть результат:


        Ответственный за парсинг кусочек кода
        object FormulaParser extends RegexParsers with PackratParsers {
        
            def id: Parser[Id] = "[a-zA-Z][a-zA-Z0-9_]*".r ^^ Id
        
            def number: Parser[Number] = "-" ~> number ^^ (n => Number(-n.value)) |
                ("[0-9]+\\.[0-9]*".r | "[0-9]+".r) ^^ (s => Number(s.toDouble))
        
            def funcCall: Parser[FuncCall] = id ~ ("(" ~> expression <~ ")") ^^ {case id ~ exp => FuncCall(id, exp)}
        
            def value: Parser[Expression] = number | funcCall | id | ("(" ~> expression <~ ")")
        
            lazy val term: PackratParser[Expression] = term ~ ("*" | "/") ~ value ^^ binOperation | value
        
            lazy val expression: PackratParser[Expression] = expression ~ ("+" | "-") ~ term ^^ binOperation | term
            ...
        }

        Посмотрите на следущую строчку:


        def value: Parser[Expression] = number | funcCall | id | ("(" ~> expression <~ ")")

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


        Это возможно по следующим причинам:


        1. В scala разрешено давать методам замечательные названия типа "~", "~>", "<~", "|", "^^". Комбинация парсеров p и q записывается как p~q, а возможность выбрать один из них: p|q. Читается намного лучше, чем p.andThen(q) или p.or(q)
        2. Благодаря неявным преобразованиям (implicits) и строчка "abc" и регулярное выражение "[0-9]+".r при необходимости превращаются в парсеры.
        3. В языке мощная статическая система типов, которая позволяет ловить ошибки сразу.

        Думаю, мне удалось Вас заинтересовать, поэтому дальше всё будет по порядку.


        Читать дальше →
      • Мифы о Spark, или Может ли пользоваться Spark обычный Java-разработчик

          Продолжаем расшифровывать и местами облагораживать хардкорные доклады спикеров JPoint 2016. Сегодня доклад поменьше, всего час с копейками, соответственно, концентрация пользы и отжига на одну минуту зашкаливает.

          Итак, Евгений EvgenyBorisov Борисов о Spark, мифах и немного о том, дествительно ли тексты Pink Floyd адекватнее, чем у Кэти Пэрри.





          Это будет необычный доклад о Spark.

          Обычно много рассказывают про Spark, какой он крутой, показывают код на Scala. Но у меня немного другая цель. Во-первых, я поговорю о том, что такое Spark и зачем он нужен. Но основная цель — показать, что вы, как Java-девелоперы, можете прекрасно им пользоваться. В этом докладе мы развеем несколько мифов о Spark.
          Читать дальше →
          • +26
          • 17,2k
          • 6
        • Создание веб-приложений с помощью Scala.js и React — часть 1

          Перевод статьи Pedro Palma Ramos "Building Web applications with Scala.js and React — Part 1"


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


          Scala.js — это реализация Scala за авторством Sébastien Doeraene, которая компилирует код Scala в JavaScript, а не в байт-код JVM. Она поддерживает полную двустороннюю функциональную совместимость между Scala и JavaScript-кодом и, следовательно, позволяет разрабатывать фронтенд веб-приложения на Scala с использованием библиотек и фреймворков JavaScript. Она также способствует уменьшению дублирования кода по сравнению с обычным веб-приложением на Scala, поскольку позволяет повторно использовать на фронтэнде модели и бизнес-логику, разработанные для серверной части.


          React, с другой стороны, представляет собой веб-фреймворк для создания пользовательских интерфейсов в JavaScript, разработанный и поддерживаемый Facebook и другими компаниями. Он способствует чистому разделению между обновлением состояния приложения в ответ на пользовательские события и визуализацией представлений на основе указанного состояния. Поэтому фреймворк React особенно подходит для функциональной парадигмы, которая используется при программировании на Scala.

          Читать дальше →
        Самое читаемое