在 Haskell 中,您可以构造参数化类型,如下例所示:
data Tree a = Leaf | Node a (Tree a) (Tree a)
..然后如果类型参数也是相同类型类的实例,则将它们设为类型类的实例(此处使用 Eq 作为示例,它可以是任何东西):
instance (Eq m) => Eq (Tree m) where
Leaf == Leaf = True
Node a b c == Node x y z = (a == x) && (b == y) && (c == z)
_ == _ = False
我想知道在 Scala 中如何实现类似的事情。首先让我们创建参数化类型:
abstract class Tree[T]
case class Leaf[T]() extends Tree [T]
case class Node[T](value: T, left: Tree[T], right: Tree[T]) extends Tree [T]
..并选择一个更简单的特征作为正在实现的类型类:
trait Serializable {
def toDifferentString(): String
}
现在我想做的是提供Serializable
trait 的实现Tree
,如果T
类型是Serializable
.
我可以看到几种方法来部分地做到这一点,但没有一种方法能让我得到类似 Haskell 的结果:
:<
在抽象类中添加一个类型约束Tree
,但是它变得不那么通用了,我假设我可以修改这个Tree
类- 创建一个从
Tree[Serializable]
to的隐式转换Serializable
,但我什至不确定它是否会起作用以及它的鲁棒性如何。
解决问题的好方法是什么?