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

int*_*tar 0 haskell types

继我的问题之后: 如何将可选属性附加到值?

我正在尝试定义音乐的Haskell表示.

我想做点什么:

data Chord = Chord Int Modality [Annotate] deriving (Eq, Show, Read)
Run Code Online (Sandbox Code Playgroud)

据我所知定义了一种新的和弦类型.

然后我希望能够将其他事件中的和弦添加到分数中

data Event = Note Int | Chord Int Modality [Annotate] | Rest
Run Code Online (Sandbox Code Playgroud)

但是,编译器说我正在尝试两次定义Chord.

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

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)  
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.那么为什么在这个例子中使用"Tree"是可以的,而不是在我的"Chord"中呢?

lef*_*out 7

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

type Note = Int

data Event = NoteEvent Note | ChordEvent Chord | Rest
Run Code Online (Sandbox Code Playgroud)

或者,您可以保持Event原样,但是您基本上已经内联了Chord数据类型的整个定义,因此您不再需要它.