如何在scala中定义某个递归类型

如何在scala中定义某个递归类型,scala,recursion,types,Scala,Recursion,Types,假设我有一个类型a。我如何在scala中定义类型B,它是单位或元组(a,B) 我想建模一个类型B[a],它可以 (), (A, ()), (A, (A, ())), (A, (A, (A, ()))), (..., (A, (A, (A, ())))). 我见过这样的事情 trait B[A] extends (A, B) {} 或在 但由于缺少终止单元的可能性,因此无法使用我发现的内容 谢谢。它看起来像是免费的单子。您可以从scalaz库或cats获取一个实现,它看起来像一个免费的Mo

假设我有一个类型
a
。我如何在scala中定义类型
B
,它是
单位
或元组
(a,B)

我想建模一个类型
B[a]
,它可以

(), (A, ()), (A, (A, ())), (A, (A, (A, ()))), (..., (A, (A, (A, ())))). 
我见过这样的事情

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

但由于缺少终止
单元
的可能性,因此无法使用我发现的内容


谢谢。

它看起来像是免费的单子。您可以从
scalaz
库或
cats

获取一个实现,它看起来像一个免费的Monad。您可以从
scalaz
库或
cats

中获取一个实现,以下内容如何(类似于
列表
的定义):

以下内容如何(类似于
列表
的定义):


您需要使用密封特征(alegbraic数据类型)对类型安全性的可能性进行编码

看看Shapess[1]中的HList是如何实现这一点的

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
HList
密封特征HNil扩展HList
案例对象HNil扩展HNil

案例类::[+H,+T您需要使用密封特征(alegbraic数据类型)来编码类型安全性的可能性

看看Shapess[1]中的HList是如何实现这一点的

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
HList
密封特征HNil扩展HList
案例对象HNil扩展HNil

案例类别::[+H,+T我认为它更像shapless中的HList。我不知道它与free有多大关系。@Stephen,实际上,它甚至是类型
列表
,因为所有元素都有相同的类型。我认为它更像shapless中的HList。我不知道它与free有多大关系。@Stephen,实际上,它甚至是类型
列表
,因为所有元素都是elemeNT具有相同的类型。
类型B[A]=列表[A]
类型B[A]=列表[A]