我正在尝试编写一个转换库,用于将一些 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
我都会得到正确的转换。就像任何其他Iterable
val 一样。
我的问题和问题是我如何递归地使用这个 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
定义更改为def toHtml = <ul> { l.map{ e => <li>{ e.toHtml }</li> } } </ul> toString
不起作用,因为编译器告诉我value toHtml is not a member of type parameter A
这是完全合理的。
我知道我的问题可能在于new Object { ... }
我从fromIterable[A]
隐式定义返回,这可能应该返回一个具有特征或其他东西的类。
我已经尝试阅读很多关于隐式的内容,但我还没有弄清楚能够递归地应用这种toHtml
转换,而无需取消参数化 fromIterable 签名并定义几个特定情况,例如fromIterable(l : List[List[Any]])
或类似的东西......
你们能否请我给我一些关于如何实现它的建议以及我做错了什么?
谢谢!