在 Haskell 中创建我自己类型的二维列表时出错

Errors upon creation of 2d list of my own types in Haskell

基本上我已经创建了一个具有三个属性的类型,我们称之为 "Foo"

type Foo = Foo Att1 Att2 Att3

每个属性都是 3 个值之一,我用这种格式声明每个属性:

data Att1 = A | B | C

现在,在对何时使用 "data" 或 "type" 之间的区别进行了一些猜测之后,我尝试制作 Foo 的二维列表:

type fooList = fooList [[Foo A A A, Foo B A C], [Foo C A B, Foo B B A]]

编辑:当我 assemble 这个列表

时,我也遇到同样的错误
data fooList = fooList [[Foo A A A, Foo B A C], [Foo C A B, Foo B B A]]

编译时这会导致两个主要错误:

Not in scope: type constructor or class ‘A’
A data constructor of that name is in scope; did you mean DataKinds?

Illegal Type ["Copy of foolist"]. Perhaps you intended to use DataKinds

我哪里错了?我或多或少地尝试过跟随 learnyouahaskell 到发球区,但无论我尝试了多少种方法,我都会不断收到类似的错误。

首先Foo的定义是错误的。由于这里包含多个值,并且Foo不是已经定义的类型,所以需要这样构造:

<b>data</b> Foo = Foo Att1 Att2 Att3

如果你定义了type Foo = Foo Att1 Att2 Att3那么你定义了一个类型别名,但是定义一个相同类型的类型别名(如此递归地)在这里没有多大意义。

此外 Att2Att3 可能只是 Att1s:

data Foo = Foo Att1 Att<b>1</b> Att<b>1</b>

此外,您 不需要 需要 typedata 来声明一个值。您可以通过将其指定为:

来创建二维列表
fooList = [[Foo A A A, Foo B A C], [Foo C A B, Foo B B A]]

所以这里我们声明了一个存储的变量:一个列表的列表,每个元素是一个Foo项。