Как заставить безопасных строителей Kotlin работать в Scala?

У Kotlin есть потрясающие типы безопасных сборщиков, которые позволяют создавать dsl, как это

html { head { title("The title") body {} // compile error } body {} // fine } 

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

Мне интересно, если это может быть достигнуто в Scala. Как его получить?

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

 object HtmlBuilder extends App { import html._ val result = html { div { div{ a(href = "http://stackoverflow.com") } } } } sealed trait Node case class Element(name: String, attrs: Map[String, String], body: Node) extends Node case class Text(content: String) extends Node case object Empty extends Node object html { implicit val node: Node = Empty def apply(body: Node) = body def a(href: String)(implicit body: Node) = Element("a", Map("href" -> href), body) def div(body: Node) = Element("div", Map.empty, body) } object Node { implicit def strToText(str: String): Text = Text(str) } 
Intereting Posts
Кинжал 2, вводящий представление модели активности в фрагмент Как добавляются дополнительные свойства градиента в DSL Kotlin? Разница между различными функциями verifySignatures в тестировании блока Corda Java-обработчик аннотации – аннотированные тесты классов классов Kotlin Android Studio 1.5 с плагином Kotlin получил исключение, когда он находится в режиме отладчика. Как это исправить? Android – Kotlin: вернуть значение в async fun Jackson @ JsonIgnoreProperties несколько полей с Kotlin Повторная установка + повтор RxJava с другой ссылкой Как обходить NetworkOnMainThreadException на Kotlin Ошибка конфигурации Kotlin Почему первое вычисление в приложении для Android медленное, а все последующие вычисления быстры kotlin: как я могу вызвать функцию из выражения объекта Хорошо ли, что Котлин допускает расширение существующих типов? Выбранный в настоящее время отладчик Java не поддерживает точки останова типа «Точки останова линии Котлин», Метод вызова из класса Kotlin