1

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

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

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

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

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

这是一个音乐应用程序。Event可以是 a NoteEvent、 a DecrescendoEvent、 a VolumeEvent、 aKeyEvent或任何会在一首音乐中“发生”的东西。

ANoteEvent将没有孩子,而ADecrescendoEvent将有孩子事件,它会逐渐减少其数量。

我究竟做错了什么?

4

1 回答 1

2

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

1) 将所有事件组合成一个代数数据类型,它可能看起来像这样:

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

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

2)将事件类型包装在某种“包装器”类型中,并创建类型的集合。有关这方面的更多信息,请参阅http://www.haskell.org/haskellwiki/Heterogenous_collections

于 2013-03-11T16:48:41.737 回答