2017-05-14 76 views
0

假设我有一个类型A。我该如何在scala中定义一个类型B,它是Unit或者元组(A, B)如何在scala中定义某种递归类型

我想一个类型B[A]可以是

(), (A,()), (A, (A,())), (A, (A, (A,()))), (..., (A, (A, (A,())))). 

我在

What does the `#` operator mean in Scala?

看到的东西像

trait B[A] extends (A, B) {} 

或实例,但没有能够模拟与自终止以来我发现的一样可能性丢失。

谢谢。

+1

'类型B [A] =列出[A]' –

回答

0

你需要使用一个密封的特性(alegbraic数据类型)来编码与类型安全的可能性。

请参阅从无形的HList [1]请问这是怎么..

sealed trait HList 
sealed trait HNil extends HList 
case object HNil extends HNil 
case class ::[+H, +T <: HList](head: H, tail: T) extends HList 

@ val xs = 1 :: 2.0 :: "three" :: HNil 
xs: Int :: Double :: String :: HNil = 1 :: 2.0 :: three :: HNil 

当你说你需要它要么一个元组或一个单位,这些都是案件extendsealed trait。然后你可以使用详尽的模式匹配。

[1]

-1

它看起来像一个免费单子。您可以从scalaz库或cats执行。

+0

我认为它更像HList从shapless。我没有看到它与免费有多大关系。 – Stephen

+1

@Stephen,实际上,它甚至是'List'类型,因为所有元素都具有相同的类型。 –

+0

@CyrilleCorpet,哦对。谢谢。 – Stephen

4

如何以下(类似于List是如何定义的):

trait NestedTuple[+A] 

case class Tup[A](a: A, tail: NestedTuple[A]) extends NestedTuple[A] 
case object End extends NestedTuple[Nothing] 

val t1: NestedTuple[Int] = End  
t1: NestedTuple[Int] = End 

val t2: NestedTuple[Int] = Tup(1, Tup(2, End)) 
t2: NestedTuple[Int] = Tup(1,Tup(2,End))