2014-03-03 132 views
0

從我的問題在這裏繼:How do I attach optional attributes to values?使用其他數據類型定義的數據類型

我試圖定義音樂的哈斯克爾表示。

我想要做的事情是:

data Chord = Chord Int Modality [Annotate] deriving (Eq, Show, Read) 

其中,按照我的理解定義了一種新類型,是一個和絃。

然後,我希望能夠除其他事件和絃添加到得分,使得

data Event = Note Int | Chord Int Modality [Annotate] | Rest 

但是,編譯說我試圖定義和絃的兩倍。

那麼,有沒有辦法在新的數據類型定義中使用早期定義的數據類型?我在做什麼看起來,對我來說,或多或少像經典的樹定義:

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

它的工作正常。那麼,爲什麼在這個例子中使用「樹」,而不是我的「和絃」呢?

回答

7

問題不在於如何定義兩次,但有關定義Chord兩次構造。你可能想

type Note = Int 

data Event = NoteEvent Note | ChordEvent Chord | Rest 

或者,你可以離開Event原樣,但你基本上內聯Chord數據類型的整個定義,所以你不需要這樣了呢。

+0

確定。作品。謝謝 – interstar

4
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的數據構造函數,它是一個不可否認的。數據構造函數在模塊中的所有數據類型中必須是唯一的。如果你想使用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) 
相關問題