0

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

type Foo = Foo Att1 Att2 Att3

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

data Att1 = A | B | C

现在,在对何时使用“数据”或“类型”之间的区别进行了一些猜测之后,我尝试制作 Foo 的 2D 列表:

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

编辑:当我组装这个列表时,我也会遇到同样的错误

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 到发球台,但无论我尝试了多少种方法,我都会不断收到类似的错误。

4

1 回答 1

4

首先定义Foo是不正确的。由于它在这里包含多个值,并且Foo不是已经定义的类型,因此您需要像这样构造它:

data Foo = Foo Att1 Att2 Att3

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

此外Att2Att3并且可能只是Att1s:

data Foo = Foo Att1 Att1 Att1

此外,您不需要或声明值。您可以通过将其指定为来创建二维列表:typedata

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

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

于 2018-09-04T08:41:11.847 回答