У меня вопрос относительно вывода типов в конструкторах типов Scala. Я использую Scala 2.9.1 ...
Предположим, я определил Tree:
sealed trait Tree[C[_], A]
case class Leaf[C[_], A](a: A) extends Tree[C, A]
case class Node[C[_], A](a: A, c: C[Tree[C, A]]) extends Tree[C, A]
И определил BinaryTree на основе моего определения Tree:
type Pair[A] = (A, A)
type BinaryTree[A] = Tree[Pair, A]
Теперь я могу определить BinaryTree целых чисел как таковое:
val tree: BinaryTree[Int] = Node[Pair, Int](1, (Leaf(2), Leaf(3)))
проблема в том, что я должен указывать параметры типа всякий раз, когда я создаю экземпляр Node
.
Итак, если сделать это:
val tree: BinaryTree[Int] = Node(1, (Leaf(2), Leaf(3)))
Я получаю сообщение об ошибке:
error: no type parameters for method apply: (a: A, c: C[Tree[C,A]])Node[C,A] in
object Node exist so that it can be applied to arguments (Int, (Leaf[Pair,Int], Leaf[Pair,Int]))
--- because ---
argument expression's type is not compatible with formal parameter type;
found : (Leaf[Pair,Int], Leaf[Pair,Int])
required: ?C[Tree[?C,?A]]
val tree: BinaryTree[Int] = Node(1, (Leaf(2), Leaf(3)))
^
Можно ли каким-либо образом принудить проверку типов, чтобы мне не приходилось явно указывать типы узла
?
Спасибо!
Если я правильно понял, утверждение
type Pair[A] = (A, A)
в моем исходном вопросе не работает, поскольку это объявление Pair является просто синтаксическим сахаром для конструктора типа Tuple2 (для которого требуются два типа: параметры). Это приводит к сбою механизма вывода типов.
Если я объявлю свой собственный класс Pair (как предлагает Дидерд в своем ответе), мне удастся заставить Дерево работать правильно.
// Assume same Tree/Leaf/Node definition given above
case class MyPair[A](_1: A, _2: A)
type BinaryTree[A] = Tree[MyPair, A]
Тогда я могу сделать это ...
scala> val t: BinaryTree[Int] = Leaf(3)
t: BinaryTree[Int] = Leaf(3)
scala> val t2: BinaryTree[Int] = Node(1, MyPair(Leaf(2), Leaf(3)))
t2: BinaryTree[Int] = Node(1,MyPair(Leaf(2),Leaf(3)))
Я знаю, что Дидиерд упомянул это решение мимоходом, но, похоже, оно ведет себя так, как я хочу.Пожалуйста, дай мне знать, что ты думаешь!