Tej*_*eni 4 haskell functional-programming scala
如何在scala中定义此类
data NestedList a = Elem a | List [NestedList a]
这在Haskell中意味着NestedList是一个Type,它可以包含Elem或另一个NestedList.是否有可能在scala中执行这些递归定义?
实际上这就是我想要实现的目标
请在此页面中查看问题7.
更新....
掌握下面的答案,我NestedList为Elem和创建了特征和案例类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)
来自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)