2016-09-22 6 views
5

KotlinはAwesomenesとは、あなたが自動補完でも正しく動作する、ヘッド内部の体のように、無効な場所にタグを置くことができないということである。このKotlinの型安全なビルダーをScalaで動作させるには?

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

のようなDSL年代を作成することが可能にすることtype safe builders素晴らしいを持っています。

これがScalaで実現できるのであれば興味があります。それを得る方法?

答えて

1

htmlの作成に興味がある場合は、同様の概念を使用するscalatagsという図書館があります。 このようなビルダーを実現するために、特定の言語構成は必要ありません。ここに例があります:

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) 
} 
+0

スカラタは型安全性要件を満たしていません。 – Yaroslav

+0

@Yaroslavまあ、そうです。そして、それは少なくとも今のところ、きちんとしたapiを作る方法ではないようです。ある日、暗黙の関数型のDottyがhttp://dotty.epfl.ch/blog/2016/12/05/implicit-function-types.html#how-to-remove-boilerplateになります。彼らはあなたが必要とするものを正確に行います。 –

+0

@ Yaroslavもう1つ、libpture https://github.com/propensive/raptureというlibがあります。また、型保証テンプレートを実装できます。ドキュメントは純粋ですが、動作します。次に、ウェブサイトhttps://github.com/propensive/contextual-web/blob/master/src/main/scala/main.scalaの例を示します。 –

関連する問題