Tôi có một câu hỏi liên quan đến loại-inferencing trên Scala's type-constructors. Tôi đang chạy Scala 2.9.1 ...Scala Type-Inference cho Type Constructor
Giả sử tôi định nghĩa 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]
Và định nghĩa một BinaryTree dựa trên định nghĩa Cây của tôi:
type Pair[A] = (A, A)
type BinaryTree[A] = Tree[Pair, A]
bây giờ tôi có thể định nghĩa một BinaryTree số nguyên như vậy:
val tree: BinaryTree[Int] = Node[Pair, Int](1, (Leaf(2), Leaf(3)))
Vấn đề với điều này là tôi phải cung cấp thông số loại bất cứ khi nào tôi vào stantiate Node
.
Vì vậy, nếu làm được điều này:
val tree: BinaryTree[Int] = Node(1, (Leaf(2), Leaf(3)))
tôi nhận được lỗi:
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)))
^
Có cách nào tôi có thể ép buộc kiểu trình kiểm tra vì vậy mà tôi không cần phải cung cấp một cách rõ ràng các loại Node
?
Cảm ơn!
Revised Sau didierd Bình luận của
Nếu tôi hiểu một cách chính xác, báo cáo kết quả
type Pair[A] = (A, A)
trong câu hỏi ban đầu của tôi không hoạt động kể từ khi tuyên bố Cặp này chỉ là cú pháp đường đối với một hàm tạo kiểu Tuple2 (yêu cầu hai kiểu tham số). Điều này làm cho trình sắp xếp không thành công.
Nếu tôi khai báo lớp Cặp của riêng mình (như didierd gợi ý trong câu trả lời của mình), tôi thành công trong việc đưa Cây hoạt động chính xác.
// Assume same Tree/Leaf/Node definition given above
case class MyPair[A](_1: A, _2: A)
type BinaryTree[A] = Tree[MyPair, A]
Sau đó, tôi có thể làm điều này ...
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)))
Tôi biết didierd đề cập giải pháp này trong đi qua, nhưng điều này dường như cư xử theo cách tôi muốn. Xin vui lòng cho tôi biết những gì bạn nghĩ!
Về mã được sửa đổi của bạn: nó giống với giải pháp của @ David hơn. Các kiểu không được suy luận đầy đủ, bạn phải nhập biểu thức rõ ràng là BinaryTree [Int].Tôi nghĩ điều này khá hợp lý. Các giải pháp biến đổi tránh được điều đó, nhưng nó đi kèm với một mức giá: trong khi hiệp phương sai chủ yếu là một điều tốt, nó hạn chế những gì lớp học có thể làm. Đặc biệt, nó chỉ hoạt động với các loại C là các biến thể. –