Scala: Предложение для идеи для руки на сессию

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

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

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

6
задан Dario 10 January 2010 в 11:09
поделиться

4 ответа

У меня есть оповещения google для html 5 ИЛИ css 3

-121--3238907-

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

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

class InputForm(forms.Form):
    text = forms.CharField(max_length=16384, widget=forms.TextArea)
    ...

Это позволит убедиться, что максимальная длина, которую пользователь может успешно ввести, составляет 16k.

-121--4904227-

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

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

  • case classes
  • образцов matching
  • функций высшего порядка

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

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

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 .

4
ответ дан 9 December 2019 в 22:35
поделиться

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

  • постарайтесь придерживаться вашей аудитории бизнес-сферы. Попробуйте взять пример (даже основы) из их обычных приложений.
  • попробуйте угадать основной язык вашей аудитории (java, perl, C++) и сделайте синтаксические сравнения в ваших примерах.
  • посмотрите: Экскурсия по скала и фрагменты скала и выбор функций для преасентации, которые вам понравились и вам понравились.
  • постарайтесь запомнить свои ранние шаги со скалой и ситуации, в которых вы были впечатлены (или озадачены).
3
ответ дан 9 December 2019 в 22:35
поделиться

Организационный корректор был использован пример, чтобы объяснить Python в Devdays Stackoverflow. A Реализация 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 

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

1
ответ дан 9 December 2019 в 22:35
поделиться

Обычно существуют преобразования времени выполнения, так как битовые представления, как правило, не совместимы (за исключением того, что двоичные 0 обычно являются как 0, так и 0,0). Стандарты C и C++ имеют отношение только к значению, а не к представлению и определяют в целом разумное поведение. Помните, что большое значение int обычно не может быть точно представлено в float , а большое значение float не может быть представлено как int .

Поэтому:

Все преобразования по значению, а не по биту узоров. Не беспокойся о узорах.

Не беспокойтесь об энданнесе, так как это вопрос побитового представления.

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

Определения языка ничего не говорят о битовых узорах.

Преобразование float в int также является вопросом значений, а не бит узоров. Точная плавающая точка 2.0 будет преобразована в интеграл 2, потому что именно так настраивается реализация, а не из-за битовых узоров.

-121--1672147-

Предпочитаю следующее решение (требуется Джанго > = 1,0).

settings.py

INSTALLED_APPS+= ('django.contrib.flatpages',)

urls.py

urlpatterns+= patterns('django.contrib.flatpages.views',
    url(r'^about-us/$', 'flatpage', {'url': '/about-us/'}, name='about'),
    url(r'^license/$', 'flatpage', {'url': '/license/'}, name='license'),
)

В шаблонах

[...]
<a href="{% url about %}"><span>{% trans "About us" %}</span></a>
<a href="{% url license %}"><span>{% trans "Licensing" %}</span></a>
[...]

или в коде

from django.core.urlresolvers import reverse
[...]
reverse('license')
[...]

Это путь вам не нужно использовать django.contrib.flatpages.middleware.FlatpageFallbackMiddleware , и реверс работает как обычно, не записывая столько кода, сколько в других решениях.

Ура.

-121--2178529-

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

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

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

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

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

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

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

3
ответ дан 9 December 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: