1

私はHaskellを初めて使用し、そのプログラミングアプローチがとても気に入っています。

私は過去2日間この問題に遭遇していて、何をしようとしても、それは機能しません。Haskellの性質について何か混乱していると思います。

これが私のコードです(それは機能しません):

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

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

これは音楽アプリケーション用です。、、、、、、または音楽の一部で「発生する」ものであれば何でもかまいませんEventNoteEventDecrescendoEventVolumeEventKeyEvent

ANoteEventには子がありませんが、aDecrescendoEventには子イベントがあり、徐々にボリュームが減少します。

私は何が間違っているのですか?

4

1 に答える 1

2

あなたが抱えている問題は、[a]のようなシーケンスには1つのタイプしか含めることができないということです。これに対処するには2つの方法があります。

1)すべてのイベントを単一の代数的データ型に結合します。これは次のようになります。

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

...等々。これで、タイプ[イベント]のデータを操作できます。次のような子を含めることができます。

2)イベントタイプをある種の「ラッパー」タイプでラップし、そのタイプのコレクションを作成します。詳細については、 http://www.haskell.org/haskellwiki/Heterogenous_collectionsを参照してください。

于 2013-03-11T16:48:41.737 に答える