Рубрика: Scala

  • Поиск. КМП-алгоритм

    Недавно на досуге решил написать алгоритм КМП  (КнутаМорриса — Пратта) для Scala.

    Изначально, мне нужно было решить простенькую задачку – найти последовательность байт в потоке байтов. Сделал на Java. Потом, решил сделать тоже самое на Scala. Занятно, но в стандартной библиотеке коллекций Scala используется именно КМП поиск.

    Вот мой вариант.
    (далее…)

  • Читерство в NetBeans. Ввод и использования мат. символов и букв греческого алфавита.

    Оригинальная идея взята из поста Gabriel’s software development blog. Статья довольно старая, опубликована еще в прошлом году .

    Если коротко:

    def √(x:Double)=Math.sqrt(x)
    def ∑(r:Range)(f:Int => Int)=r.foldLeft(0)(_+ f(_))
    def ∏(r:Range)(f:Int => Int)=r.foldLeft(1)(_* f(_))
    val s= ∑(1 to 100)(x=>√(x))
    

    Это обычный Scala код! Выглядит он прикольным, потому что мы используем знакомые всем со школы/института символы. Но как сделать так, чтобы было удобно вводить эти символы для меня было загадкой.

    В итоге недавно случайно придумал как это можно сделать просто и удобно средствами IDE, а точнее в NetBeans.

    Я вбил все нужные мне символы в Code Templates (Tools → Options → Editor → Code Templates) и сделал два макроса для [Alt+<] = “←” и [Alt+>] = “⇒”.

    Как это работает можно посмотреть здесь:

    То есть вы вводите например alpha и жмете [Tab], в результате в код вставляется α. Самое главное, это настраивается только для нужного языка (в частности Scala), таким образом это не мешает в работе с другими языками. Также если вы хотите написать просто alpha, без преобразования, вы просто НЕ нажимайте [Tab] и всё!

    Самое главное! Исходники должны быть в UTF-8 (ну или другой юникодной кодировке)!
    P.S.: На самом деле вбивать весь греческий алфавит довольно скучное занятие, можно найти файл вроде этого:

    C:\Documents and Settings\<USER_NAME>\.netbeans\6.9\config\Editors\text\x-scala\CodeTemplates\org-netbeans-modules-editor-settings-CustomCodeTemplates.xml

    и сгенерить туда все аббревиатуры.

    Вот пример моего файла – CustomCodeTemplates.zip. Внимание! Это только пример, возможно он Вам не подойдет.
    Будьте аккуратны, перед обновлением сделайте резервную копию!

  • Магия унарных операторов в Scala (unary_)

    Многие знают, что в Scala возможна перегрузка операторов.

    К примеру, пусть у нас будет класс – двухмерная точка:

    class Point(val x: Double, val y: Double) {
    
      def -(p: Point) = new Point(x-p.x, y-p.y);
      def +(p: Point) = new Point(x+p.x, y+p.y);
    
    }

    Работать с ней приятно:

       val p1 = new Point(2,2);
       val p2 = new Point(1,1);
       val p = p2 - p1;
    

    Но что делать, если хочется определить унарный минус, т.е. чтобы можно было писать вот так:

       val p = new Point(2,2);
       val antiP = -p;
    

    Конечно, вы можете попробовать сделать так:

        // ТАК ДЕЛАТЬ НЕ НАДО!
        def -() = new Point(-x,-y);
    

    Такой код конечно скомпилируется, но тогда и пользоваться им придется следующим образом:

       val antiP = p-;
    

    Что же делать? (далее…)

  • For в Scala

    Цикл for в Scala.

    for ( i < - 1 to 10)  {
         println(i)
    }
    

    Что получится в итоге? Здесь все понятно. На консоль будут выведены числа от 1 до 10 включительно.

    Как это работает? Здесь немножко сложнее...
    Число 1 — это Int, будет неявно преобразован компилятором в тип RichInt.
    У RichInt есть метод to(end:Int), который возвращает объект класса Inclusive, который наследуется от класса Range.
    Такие объекты замечательны тем, что позволяют нам пробежаться по некоторому диапазону целых чисел с определенным шагом.
    То есть наш цикл, аналогичен следующему примеру:

    for ( i < - 1.to(10) )  {
         println(i)
    }
    

    Кстати, если вы хотите увеличить шаг до двух, вы можете воспользоваться методом to(end: Int, step: Int). Например:

    for ( i < - 1 to (10,2) )  {
         println(i)
    }
    

    Идем дальше.
    Оператор < - является генератором, который присваивает переменной i по-очереди значения из интервала [1,10] с шагом 1.
    Как работает этот генератор для цикла for ?
    Согласно спецификации языка, происходит следующее:

    The translation scheme is as follows. In a first step, every generator p < -e, where p is not irrefutable (§8.1) for the type of e is replaced by p < - e.withFilter { case p => true; case _ => false }
    Then, the following rules are applied repeatedly until all comprehensions have been
    eliminated.
    • A for comprehension for (p < -e ) yield e0 is translated to
    e.map { case p => e0 }.
    • A for loop for (p < - e ) e0 is translated to e.foreach { case p => e0 }.
    ...

    Таким образом наш цикл, преобразуется к виду:

    (1 to 10).foreach {
        case i => println(i)
    }
    

    Где для для каждого i выполняется println(i).
    Все просто и без императивщины.

    Небольшое объявление
    Благодаря моему бывшему шефу в аспирантуре и кафедре информатики МФТИ, в следующем учебном году в осеннем семестре будет преподаваться семестровый курс по выбору “ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА JAVA И SCALA”. Кому интересно — приходите.

  • Опять Scala

    Начал формировать небольшой справочник с примерами на Scala для собственного пользования.

    Импорт

    import java.util.{Date,Calendar}
    import java.util.logging._
    

    Простой цикл

    for ( x < - 1 to 10)  {
         println(x)
    }
    

    Получить класс

    classOf[String]
    // Например: LoggerFactory.getLogger(classOf[Foo])
    

    Создать список

    val x = new scala.collection.mutable.ListBuffer[Int];
    x+=1998
    x+=2000
    x+=2001
    x(0)=1999 // изменить элемент
    

    Простой match

    val x = "admin";
    x match {
         case "admin" => println ("Hello master!");
         case unknown => println("Hello " + unknown);
    }
    

    Простой try – catch

    try {
          //
          throw new IllegalAccessException("access!")
        } catch {
          case e: IllegalAccessException  =>
            println("IllegalAccess:" + e)
          case e: InstantiationException  =>
            println("Instantiation:" + e)
          case e =>
              // все остальные
              println("Unknown :(" )
        }
    
  • Учебное пособие по Scala. Вольный перевод.

    В связи с малым количеством (на момент публикации этого поста) полноценных учебных материалов по языку программирования Scala на русском языке , постарался сделать простой перевод краткого пособия.
    Оригинальная статья лежит здесь http://www.scala-lang.org/docu/files/ScalaTutorial.pdf
    Корректура текста будет осуществляться после публикации, по ходу получения отзывов, комментариев и повторной вычитки. Возможно, через некоторое время выложу PDF-версию.

    Scala Tutorial.

    Авторы: Michel Schinz, Philipp Haller. Версия 1.3. 15 марта, 2009

    Учебное пособие по Scala. Вольный перевод.

    Автор перевода: Вит. 30 марта 2010.

    Введение

    Этот документ дает краткое представление по языку и компилятору Scala. Предполагается, что читатель уже имеет некоторый опыт в программировании и хочет получить представления о том, что он может делать с помощью Scala. Также предполагается, что читатель обладает базовыми знаниями в области объектно-ориентированного программирования, а если быть конкретным — на языке программирования Java.

    Первый пример

    В качестве первого пример мы возьмём стандартную программу Hello World. Возможно это не самый обворожительный примерчик, но зато он легко демонстрирует использование Scala и при этом не требует особых знаний самого языка.

    object HelloWorld {
        def main(args: Array[String]) {
            println("Hello, world!")
        }
    }
    

    Структура такой программы должна быть знакома Java-программистам. Она состоит из main-метода, который получает аргументы командной строки в виде массива строк в качестве параметров. Тело метода состоит из единственного метода println, в качестве аргумента которому передаётся «Hello, World!». Метод main ничего не возвращает, поэтому нет необходимости явно указывать тип возвращаемых данных.

    Java программиста может смутить в самом начале слово object в котором содержится main метод. (далее…)