继我的问题之后: 如何将可选属性附加到值?
我正在尝试定义音乐的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"中呢?
问题不是两次定义类型,而是定义构造函数 Chord两次.你可能想要
type Note = Int
data Event = NoteEvent Note | ChordEvent Chord | Rest
Run Code Online (Sandbox Code Playgroud)
或者,您可以保持Event原样,但是您基本上已经内联了Chord数据类型的整个定义,因此您不再需要它.