Parsing 是否可以接受单子的泛化?

Parsing 是否可以接受单子的泛化?,parsing,haskell,binaryfiles,Parsing,Haskell,Binaryfiles,我尝试解析。问题是不可能按顺序解析它 前两个步骤是读取header和DIFAT 读取标题很简单(Generic无助于减少代码行,因为默认情况下,原语(如Word16)解析为big-endian): 数据头=头 {签名::!Word64, _clsid::!clsid, _minorVersion::!Word16, _主要版本::!Word16, _字节顺序::!Word16, _sectorSize::!Int, _管理员大小::!Word16, _保留::!(Word32,Word16),

我尝试解析。问题是不可能按顺序解析它

前两个步骤是读取header和DIFAT

读取标题很简单(
Generic
无助于减少代码行,因为默认情况下,原语(如
Word16
)解析为big-endian):

数据头=头
{签名::!Word64,
_clsid::!clsid,
_minorVersion::!Word16,
_主要版本::!Word16,
_字节顺序::!Word16,
_sectorSize::!Int,
_管理员大小::!Word16,
_保留::!(Word32,Word16),
_directorySectorsCount::!Word32,
_fatSectorsCount::!Word32,
_firstDirectorySectorLoc::!Word32,
_TransactionSignatureEnum::!Word32,
_miniStreamCutoffSize::!Word32,
_firstMiniFatSectorLoc::!Word32,
_miniFatSectorsCount::!Word32,
_firstDifatSectorLoc::!Word32,
_difatSectorsCount::!Word32,
_迪法特:![Word32]
}
派生(显示)
getHeader::getHeader
getHeader=do
_签名头->读卡器(配置m)(m DIFAT)
getDIFAT头=do
r扇区注释器m->Word32->Word32->m DIFAT
go sg秒计数=do
l回程头
_->(head++)go sg tail count
因此,我可以编写两个函数来获取扇区的数据

getSectorFromBL::BL.ByteString->Word32->Word32->Identity BL.ByteString
getSectorFromBL src secSize secNo=返回$BL.take(from integral secSize)$snd$BL.splitAt offset src
哪里
偏移量=从整数((秒号+1)*秒大小)
getSectorFromFile::Handle->Word32->Word32->IO BL.ByteString
getSectorFromFile hdl secSize secNo=do
hSeek hdl绝对搜索$toInteger$secSize*(secNo+1)
BL.hGet hdl(从整数秒大小)
然后将它们保存到
Word32->m IO BL.ByteString
,然后将其传递到
Config
,然后运行
getDIFAT

是否可以接受单子的泛化

代码有问题吗