В Haskell я могу определить общий тип для дерева как:Scala дженерик: специализирующийся метод
type Tree t = Leaf t | Node (Tree t) (Tree t)
Если я хочу, чтобы определить функцию для конкретной параметризации дерева, я могу просто сделать:
-- Signature of a function that takes a tree of bool
foo :: Tree Bool -> Int
-- Takes a tree of numbers
bar :: (Num n) => Tree n -> Bool
Мы можем определить подобный тип дерева в Scala с:
abstract class Tree[T]()
case class Leaf[T](t: T) extends Tree[T]
case class Node[T](left: Tree[T], right: Tree[T]) extends Tree[T]
Но как я могу определить метод для дерева, что о nly относится к определенным типам? Нужно ли мне использовать наследование или есть способ сказать:
abstract class Tree[T]() {
// Method only for Tree[String]:
def foo[String] = ...
}
Что произойдет с 'foo', если тип' Tree' был 'Int'? Что вы ожидаете? 'val t: Tree [Int] = ...' и 't.foo()'? –
Я бы ожидал, что foo (как пример Haskell) будет определен только для Tree [Int].Вот почему я задаюсь вопросом, нужно ли мне использовать наследование для создания нового класса из дерева, но, похоже, он нарисовал новый класс, чтобы определить специализированный метод. – Suugaku
Вместо добавления метода к самому «Дереву» вы можете создать функцию, которая берет дерево в качестве параметра. Функция может объявлять определенный тип дерева (например, 'def foo (tree: Tree [String])) или он может использовать шаблон типа типа, если вы хотите сделать его общим. –