在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]
但我怎么可以定义树的方法为o只适用于某些类型?我是否需要使用继承或有一种方法说:
abstract class Tree[T]() {
// Method only for Tree[String]:
def foo[String] = ...
}
如果Tree的类型是Int,'foo'会发生什么?你能指望什么? 'val t:Tree [Int] = ...'和't.foo()'? –
我希望foo(比如Haskell的例子)只被定义为Tree [Int]。这就是为什么我想知道是否需要使用继承来从树中创建一个新类,但似乎设法派生一个新类来定义一个专门的方法。 – Suugaku
您可以创建一个将树作为参数的函数,而不是将方法添加到“树”本身。该函数可以声明特定类型的树(例如'def foo(tree:Tree [String])'),或者可以使用类型模式,如果您想使其具有通用性。 –