我正在尝试阅读 MIDI 文件作为处理二进制文件的教育练习,但我遇到了障碍。
当我阅读曲目时,我只想获取文件标题部分中声明的特定数量的曲目。这是我如何尝试解决它的代码(虽然不起作用):
getMidi = do
header <- grabHeader
tracks <- grabTracks (numTracks header)
return (header, tracks)
grabTracks :: Integer -> Get [Track]
grabTracks numT = do
if numT == 0
then do
return []
else do
myTrack <- grabTrack
otherTracks <- grabTracks (numT-1)
return myTrack : otherTracks
grabTrack :: Get Track
grabTrack = do
chunkId <- getByteString 4
chunkSize <- getWord32be
events <- getLazyByteString (fromIntegral chunkSize)
return Track {trackSize=(fromIntegral chunkSize), eventData=events}
numT
是头文件中声明的轨道数。我想这样做有两个原因。
- 最后可能有垃圾我想忽略。
- 想要将此技术应用于其他二进制文件,其中包含“某些东西”的列表。
当我尝试编译它时,我得到了这个错误:
Couldn't match expected type `Get [a]' with actual type `[a0]'
In a stmt of a 'do' block: return myTrack : otherTracks
In the expression:
do { myTrack <- grabTrack;
otherTracks <- grabTracks (numT - 1);
return myTrack : otherTracks }
In a stmt of a 'do' block:
if numT == 0 then
do { return [] }
else
do { myTrack <- grabTrack;
otherTracks <- grabTracks (numT - 1);
return myTrack : otherTracks }
Get
当我被迫使用这样的列表连接时,我不知道如何制作单子。谢谢你的时间!