代数数据类型scala定义构造函数

代数数据类型scala定义构造函数,scala,adt,Scala,Adt,我不熟悉使用scala的代数数据类型,我有一个问题: 我想定义类型binary,一个二进制数由字符串“0”和“1”表示,所以我需要3个构造函数,一个代表null值,一个代表零,另一个代表一 正如我们所知,在代数数据类型中,一是零的后继,我们可以这样写 one = suc(zero) two = suc(one) trait二进制 case类zero从二进制//null值扩展而来 case类Suc(n:Binary)从Binary//字符串“0”扩展而来 //在这里,我需要有第一个构造函数,但我

我不熟悉使用scala的代数数据类型,我有一个问题:

我想定义类型binary,一个二进制数由字符串“0”和“1”表示,所以我需要3个构造函数,一个代表null值,一个代表零,另一个代表一

正如我们所知,在代数数据类型中,一是零的后继,我们可以这样写

one = suc(zero)
two = suc(one)
trait二进制
case类zero从二进制//null值扩展而来
case类Suc(n:Binary)从Binary//字符串“0”扩展而来
//在这里,我需要有第一个构造函数,但我不知道怎么做
case类Suc(Suc(n):Binary)从Binary//扩展而来,但在我看来它似乎不符合逻辑
我的问题是如何定义一个case类

等待你的回应


提前感谢

您所描述的通常被称为“Peano数字”

这里有一个实现

abstract class Nat    //"Nat" for natural numbers
class _0 extends Nat  //or you can use "zero" here
class Succ[N <: Nat] extends Nat
翻译成
case
类可能如下所示:

trait Binary
case object Zero extends Binary
case class Suc(n: Binary) extends Binary
val one = Suc(Zero)
val two = Suc(one)   //Suc(Suc(Zero))
// etc.

我认为你混合了两件事,你混合了数字的概念和一个简单的ADT。为什么不把这三个格(
null
zero
one
)作为非空列表(
zero
one
)呢,为了让我明白一点,正如我所说的,我对ADT的概念还不太熟悉,我有点不明白你想说什么,但我不知道如何创建一个,如何创建一号的构造函数,正如你所看到的,我认为写它是不可能的,我喜欢你的看法,我想如果你给我一个例子,我会更了解这个问题,甚至adt背后的逻辑,提前感谢你的评论,我感谢@LuisMiguelMejíaSuárezi如果你甚至有一些参考资料,我将不胜感激。我的意思是,在这种情况下,你不需要使用继任者,您只需
final case object Zero扩展二进制文件
&
final case object One扩展二进制文件
trait Binary
case object Zero extends Binary
case class Suc(n: Binary) extends Binary
val one = Suc(Zero)
val two = Suc(one)   //Suc(Suc(Zero))
// etc.