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
、Tree
型T
がSerializable
.
部分的にそれを行う方法をいくつか見ることができますが、Haskell のような結果を得る方法はありません。
- 抽象クラスに型制約
:<
を追加しますが、一般的ではなくなり、クラスを変更できると想定していますTree
Tree
Tree[Serializable]
からへの暗黙的な変換を作成しますが、Serializable
それが機能するかどうか、そしてそれがどれほど堅牢であるかさえわかりません。
問題にアプローチする良い方法は何ですか?