2017-05-14 83 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))