我是Haskell的新手,我非常喜欢它的编程方法!
过去两天我一直在遇到这个问题,无论我尝试什么,它都拒绝工作。我想我对Haskell的性质感到困惑。
这是我的代码(不起作用):
data Part = Part {partName :: String, events :: [Event]}
class Event e where
getChildren :: e -> [e]
这适用于音乐应用程序。 Event
可以是NoteEvent
,DecrescendoEvent
,VolumeEvent
,KeyEvent
,也可以是音乐中“发生”的任何内容。
NoteEvent
没有孩子,而DecrescendoEvent
会有子事件,会逐渐减少音量。
我做错了什么?
答案 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。