不能在数据声明中使用类型列表

时间:2013-03-11 16:37:13

标签: haskell typeclass

我是Haskell的新手,我非常喜欢它的编程方法!

过去两天我一直在遇到这个问题,无论我尝试什么,它都拒绝工作。我想我对Haskell的性质感到困惑。

这是我的代码(不起作用):

data Part = Part {partName :: String, events :: [Event]}

class Event e where
   getChildren :: e -> [e]

这适用于音乐应用程序。 Event可以是NoteEventDecrescendoEventVolumeEventKeyEvent,也可以是音乐中“发生”的任何内容。

NoteEvent没有孩子,而DecrescendoEvent会有子事件,会逐渐减少音量。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您遇到的问题是像[a]这样的序列只能包含一种类型。有两种方法可以解决这个问题。

1)将所有事件组合成单个代数数据类型,可能如下所示:

data Event = NoteEvent {note :: Int; duration :: Int} 
             | DecrescendoEvent {getChildren :: [Event]} 
             | VolumeEvent {change :: Double, getChildren :: [Event]}

......等等。现在您可以处理[Event]类型的数据。你可以像这样包括孩子:

2)以某种“包装”类型包装Event类型,并创建 类型的集合。有关详细信息,请参阅http://www.haskell.org/haskellwiki/Heterogenous_collections