定义自引用Scala类(递归类)

Tej*_*eni 4 haskell functional-programming scala

如何在scala中定义此类

data NestedList a = Elem a | List [NestedList a]

这在Haskell中意味着NestedList是一个Type,它可以包含Elem或另一个NestedList.是否有可能在scala中执行这些递归定义?

实际上这就是我想要实现的目标

请在此页面中查看问题7.

更新....
掌握下面的答案,我NestedListElem和创建了特征和案例类NList.试图实现flatten,我被困在这里..

def flatten[T](xs: NestedList[T]): List[T] = xs match{
   case Elem(xs) => List(xs)
   //case NList //have to fill this case
}
Run Code Online (Sandbox Code Playgroud)

ret*_*nym 5

来自Haskell的代数数据类型在Scala中被惯用地转换为密封的类层次结构.

例如:

sealed abstract class List[+A]

case class Nil extends List[Nothing]

case class Elem[T](head: T, tail: List[T]) extends List[T]
Run Code Online (Sandbox Code Playgroud)

UPDATE

托马斯的答案很好地展示了递归类型定义.但是,有趣的是,您无法创建NList案例类 - 报告了合成方法的类型错误,该方法sameElements用于equals.这听起来类似于:https://lampsvn.epfl.ch/trac/scala/ticket/2867

它的工作原理是将重复的参数替换为Seq:

sealed trait NestedList[A]
case class Elem[A](e : A) extends NestedList[A]
case class NList[A](val e : Seq[NestedList[A]]) extends NestedList[A]
Run Code Online (Sandbox Code Playgroud)

  • 这些代数数据类型不是吗? (2认同)