Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在其他数据类型中使用定义的数据类型_Haskell_Types - Fatal编程技术网

Haskell 在其他数据类型中使用定义的数据类型

Haskell 在其他数据类型中使用定义的数据类型,haskell,types,Haskell,Types,以下是我在这里提出的问题: 我试图定义哈斯凯尔的音乐表现形式 我想这样做: data Chord = Chord Int Modality [Annotate] deriving (Eq, Show, Read) 据我所知,它定义了一种新的类型,即和弦 然后我希望能够在其他事件中添加和弦到乐谱中,这样 data Event = Note Int | Chord Int Modality [Annotate] | Rest 然而,编译器说我正在尝试定义两次Chord 那么,有没有办法在新的数据

以下是我在这里提出的问题:

我试图定义哈斯凯尔的音乐表现形式

我想这样做:

data Chord = Chord Int Modality [Annotate] deriving (Eq, Show, Read)
据我所知,它定义了一种新的类型,即和弦

然后我希望能够在其他事件中添加和弦到乐谱中,这样

data Event = Note Int | Chord Int Modality [Annotate] | Rest
然而,编译器说我正在尝试定义两次Chord

那么,有没有办法在新的数据类型定义中使用先前定义的数据类型呢?在我看来,我所做的事情或多或少类似于经典的树定义:

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)  

哪个好用。那么,为什么在这个例子中可以使用“Tree”,但在我的例子中不能使用“Chord”

问题不是两次定义类型,而是两次定义构造函数
Chord
。你可能想要

type Note = Int

data Event = NoteEvent Note | ChordEvent Chord | Rest
或者,您可以将
Event
保持原样,但在这里您基本上已经内联了
Chord
数据类型的整个定义,因此不再需要它

data Chord = Chord Int Modality [Annotate] deriving (Eq, Show, Read)
注意
Chord
在这里使用了两次。这两个实例用于两个不同的对象

data Chord =                       -- This one defines a new data type
     Chord Int Modality [Annotate] -- This one defines a new data constructor
可以给这两个东西取相同的名称,因为它们存在于不同的名称空间中

data Event = Note Int | Chord Int Modality [Annotate] | Rest
现在您正试图定义另一个名为Chord的数据构造函数,这是一个禁忌。数据构造函数在模块中的所有数据类型中都必须是唯一的。如果要在此处使用
和弦
类型,请如下使用:

data Event = NoteEvent Int    | -- A new data constructor, then optionally type(s)
             ChordEvent Chord | -- A new data constructor, then optionally type(s)
             OtherEvent         -- A new data constructor, then optionally type(s)