當然,斯卡拉有遞歸類型(但可能不是你正在尋找的那種)。採取List
,例如(刪節到相關部分):
sealed abstract class List[+A] ...
final case class ::[B](head: B, tl: List[B]) extends List[B] ...
object Nil extends List[Nothing] ...
List(1, 2, 3)
遞歸地從多個列表中使用cons ::
定義。
1 :: 2 :: 3 :: Nil
還是沒有中綴表示法:
::(1, ::(2, ::(3, Nil)))
我想你可以代表類型這種方式。但請注意,你必須自己定義的類型:
sealed abstract class Inf[A]
case class Func[A](_1: A => Inf[A], _2: A) extends Inf[A] with Product2[A => Inf[A], A]
object Identity extends Inf[Nothing]
def foo(n: Int)(i: Int): Inf[Int] = {
val m = n + i
Func(foo(m) _, m)
}
還是有點更具體:
def foo(n: Int)(i: Int): Func[Int] = {
val m = n + i
Func(foo(m) _, m)
}
scala> val f = foo(5)(3)
f: Func[Int] = Func(<function1>,8)
scala> f._1(10)
res8: Inf[Int] = Func(<function1>,18)
我需要創造無限的單子!沒有人說它必須是無限的,它只需要承諾它在某個地方是無限的。這可能可以通過懶惰的輸入來完成 –
可以使用Stream()集合創建一個無限系列。有了一個自我指涉的定義,你可以擁有一系列素數,斐波那契數,階乘值等等。我不知道離你有多遠,會讓你成爲一個真正的無限單體。 – jwvh
@ElectricCoffee看我的編輯。也許這可能有幫助。 –