Scala: предложение идеи для практического занятия - PullRequest
6 голосов
/ 10 января 2010

Я хочу сделать презентацию Scala и хочу сделать это, взяв приложение и превратив его из чего-то, что использует java-идиомы, во что-то, что использует силу scala (черты, сопоставление с образцом, неявные преобразования, функциональное программирование).

Меня особенно интересует нечто, демонстрирующее изменение дизайна, а не синтаксический сахар. Что-то, где конечный скала-код, очевидно, легче поддерживать и расширять.

Так есть идеи? (Я не прошу примеры кода, только приблизительные идеи того, какой пример использовать и какие принципы проектирования можно продемонстрировать).

Ответы [ 4 ]

4 голосов
/ 10 января 2010

Прекрасным примером является разработка маленького интерпретатора для динамического мини-языка.

Базовая реализация Java требует классического шаблона проектирования интерпретатора , в то время как функциональный скала-подход может использовать множество замечательных функциональных идиом, таких как

  • кейсы
  • сопоставление с образцом
  • функции высшего порядка

или, может быть, даже монад для создания очень чистого и легко понятного кода.

Просто сравните

class Number implements Expression {
    private int number;
    public Number(int number)       { this.number = number; }
    public int interpret(HashMap<String,Integer> variables)  { return number; }
}

с

case NumberLiteral(i) => Integer(i)

См. Примеры переводчиков на странице scala .

3 голосов
/ 12 января 2010

Я думаю, что вы можете быть слишком амбициозным в вашей сфере. Просто показывать людям новый и незнакомый синтаксис, скорее всего, немного «потеряет» их, поэтому добавление еще более радикальных изменений может оказаться слишком далеко. Не забывайте: вы всегда можете сделать вторую презентацию, если первая популярна!

Некоторое время назад я делал это в своей компании; это было только , когда я давал презентацию, которую я внезапно осознал, насколько странным и непонятным какой-то синтаксис скалы появлялся перед аудиторией (или, возможно, это был мой стиль доставки!). Я обнаружил, что следующее пошло хорошо:

  1. Итеративный подход - возьмите один Java-метод (а не целую программу), а затем преобразуйте в действительно тупой подобный Scala (объявления типов и все ). Теперь примените один набор замен scala (например, вывод типа), затем другой (например, псевдонимы типов), а затем другой (например, замыкания) и т. Д. Конечный результат этого, вероятно, будет составлять около трети кода Java, гораздо более читабельного и краткий, который можно противопоставить, поскольку люди теперь знакомы с тем, что происходит. Удивительно, в какой степени Java представляет собой просто путаницу типов и ключевых слов при просмотре по сравнению с чем-то вроде scala.

  2. Потратьте некоторое время, чтобы объяснить все аспекты - например, подробно рассмотрите сопоставление с образцом и то, как оно работает. Не просматривайте экстракторы или case x :: xs. Я обнаружил, что люди действительно интересовались этим, и что в этом такого замечательного!

  3. Функциональное программирование стиль требует некоторого времени, чтобы погрузиться. Неразумно заставлять людей сразу же начать понимать это. Я программирую в Scala уже больше года, и некоторые из них меня все еще смущают.

  4. Использование REPL действительно здорово для некоторых низкоуровневых вещей, таких как показ того, как все в scala (включая синхронизированные, try-catch и т. Д.) Является выражением с типом.

Когда вы оправдаете удивительность вещей более низкого уровня, надеюсь, вы разожгете аппетит людей к большему. (Я смотрел на реализации троичного оператора с коллегой - scala-знакомый - только на прошлой неделе, и он нашел это немного запутанным. Попытка представить целое приложение кучке новичков - это слишком много!)

3 голосов
/ 10 января 2010

Чтобы помочь вам выбрать одну из функций и создать несколько хороших примеров кода, вот несколько идей:

  • попробуйте придерживаться бизнес-области вашей аудитории. Попробуйте взять пример (даже основы) из своих обычных приложений.
  • попытайтесь угадать основной язык вашей аудитории (java, perl, C ++) и сравните синтаксис в ваших примерах.
  • взгляните на: Обзор Scala и Фрагменты Scala и выберите функции для preasent, которые вам нравятся, и вам удобно.
  • попытайтесь вспомнить свои ранние шаги с помощью scala и ситуаций, в которых вы были впечатлены (или озадачены).
1 голос
/ 11 января 2010

Пример корректора орфографии был использован для объяснения Python в Stackoverflow Devdays. короткая реализация scala может быть началом:

import util.matching.Regex.MatchIterator

val alphabet = 'a' to 'z' toArray
def train(features : MatchIterator) = (Map[String, Int]() /: features)((m, f) => m + ((f, m.getOrElse(f, 0) + 1)))
def words(text : String) = ("[%s]+" format alphabet.mkString).r.findAllIn(text.toLowerCase)
val dict = train(words(io.Source.fromFile("big.txt").mkString))

def edits(s : Seq[(String, String)]) = (for((a,b) <- s; if b.length > 0) yield a + b.substring(1)) ++
  (for((a,b) <- s; if b.length > 1) yield a + b(1) + b(0) + b.substring(2)) ++
  (for((a,b) <- s; c <- alphabet if b.length > 0) yield a + c + b.substring(1)) ++
  (for((a,b) <- s; c <- alphabet) yield a + c + b)

def edits1(word : String) = edits(for(i <- 0 to word.length) yield (word take i, word drop i))
def edits2(word : String) = for(e1 <- edits1(word); e2 <-edits1(e1)) yield e2
def known(words : Seq[String]) = for(w <- words; found <- dict.get(w)) yield w
def or[T](candidates : Seq[T], other : => Seq[T]) = if(candidates.isEmpty) other else candidates

def candidates(word: String) = or(known(List(word)), or(known(edits1(word)), known(edits2(word))))

def correct(word : String) = ((-1, word) /: candidates(word))(
  (max, word) => if(dict(word) > max._1) (dict(word), word) else max)._2

List("osters", "musters", "mixters") map correct foreach println 

Он демонстрирует функции высшего порядка, поддержку кортежей, поддержку регулярных выражений, вызов по имени, для выражений. Функции ОО (система типов, черты, объекты, пакеты и видимость) отсутствуют. (Я стремился к короткой реализации.) Но вы можете получить их, чтобы получить реализацию ОО. Например, вы можете добавить некоторые черты, такие как словарь, корректор и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...