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)