不是 Scala 代码
trait ClassicNode {
def children: List[ClassicNode]
}
class BackRefdNode(val parent: Option[BackRefdNode],
node: ClassicNode) {
val children = node.children.map { c =>
new BackRefdNode(Some(this), c)
}
}
类似于 Haskell 代码
data ClassicNode
data BackRefdNode = BRN { parent :: Maybe BackRefdNode, node :: ClassicNode }
children1 :: ClassicNode -> [ClassicNode]
children1 _ = undefined
children :: BackRefdNode -> [BackRefdNode]
children this = map (\c -> BRN (Just this) c) (children1 (node this))
?
或者在 Haskell 中使用类型类
class GetChildren a where
children :: a -> [a]
data ClassicNode
data BackRefdNode = BRN { parent :: Maybe BackRefdNode, node :: ClassicNode }
instance GetChildren ClassicNode where
children _ = undefined
instance GetChildren BackRefdNode where
children this = map (\c -> BRN (Just this) c) (children (node this))
即双重翻译成Scala
trait ClassicNode
class BackRefdNode(val parent: Option[BackRefdNode],
val node: ClassicNode)
trait GetChildren[A] {
def children(a: A): List[A]
}
object GetChildren {
implicit val classicNodeGetChildren: GetChildren[ClassicNode] = _ => ???
implicit val backRefdNodeGetChildren: GetChildren[BackRefdNode] = a =>
a.node.children.map { c =>
new BackRefdNode(Some(a), c)
}
}
implicit class GetChildrenOps[A](val a: A) extends AnyVal {
def children(implicit getChildren: GetChildren[A]): List[A] =
getChildren.children(a)
}
或者您的意思是,在 Java/Scala 中,this 上的调度是动态的(与类型类的静态调度相反)。那么请看
Dynamic dispatch in Haskell
Is the dispatch of a Haskell TypeClass dynamic?
Does GHC use dynamic dispatch with existential types?