Выведение типа Scala для конструктора типов

У меня вопрос относительно вывода типов в конструкторах типов 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)))
                               ^

Можно ли каким-либо образом принудить проверку типов, чтобы мне не приходилось явно указывать типы узла ?

Спасибо!



Исправлено после комментариев Didierd

Если я правильно понял, утверждение

 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)))

Я знаю, что Дидиерд упомянул это решение мимоходом, но, похоже, оно ведет себя так, как я хочу.Пожалуйста, дай мне знать, что ты думаешь!

8
задан shj 3 December 2011 в 23:51
поделиться