いくつかのscalaタイプをHTML表現に変換するための変換ライブラリを作成しようとしています。List(1,2).toHtmlたとえば、を実行して取得<ul><li>1</li><li>2</li></ul>したいと思いStringます。
これまで、結果タイプの検出と正しいの適用にうまく機能する一連の暗黙的な変換を作成しましたtoHtml。
サンプルを見せてみましょう:
object Conversions {
implicit def fromIterable[A](l : Iterable[A]) = new Object {
def toHtml = <ul> { l.map{ e => <li>{ e }</li> } } </ul> toString
}
}
import Conversions._
このコードを使用すると、コンパイラーに問い合わせるたびList(1,2).toHtmlに、正しい変換が得られます。他のIterablevalの場合と同じように。
ここでの私の問題と質問は、このtoHtml変換を再帰的に使用するにはどうすればよいですか?を入力した場合List( List(1,2), List(3,4) ).toHtml、取得したいので<ul> <li><ul><li>1</li><li>2</li></ul></li> <li><ul><li>3</li><li>4</li></ul></li> </ul>、toHtml変換は入力のすべての要素に再帰的に適用されますIterable。
コンパイラが完全に理にかなっていると教えてくれたので、うまくいかなかったtoHtml定義を変更しようとしました。
私の問題はおそらく暗黙の定義から戻ってきていることにあることを知っています。それはおそらく特性か何かを持つクラスを返すはずです。
暗黙について多くのことを読んでみましたが、fromIterableシグネチャのパラメータを解除したり、そのようないくつかの特定のケースを定義したりせずに、この変換を再帰的に適用できることをまだ理解していません... def toHtml = <ul> { l.map{ e => <li>{ e.toHtml }</li> } } </ul> toStringvalue toHtml is not a member of type parameter Anew Object { ... }fromIterable[A]toHtmlfromIterable(l : List[List[Any]])
それを達成する方法と私が間違っていることについていくつかアドバイスをください。
ありがとう!