我正在开发一个项目,其中包括一个数据库访问层。 很正常,真的。 在之前的一个项目中,合作者鼓励我将Free Monad概念用于数据库层,所以我这样做了。 现在我试图在我的新项目中决定我所获得的。 在之前的项目中,我有一个相当像这样的API。 saveDocument :: RawDocument -> DBAction () getDocuments :: DocumentFilter -> DBAction [RawDocument] getDocumentStats :: DBAction [(DocId, DocumentStats)] 等约二十个这样的公共职能。 为了支持他们,我有了DBAction数据结构: data DBAction a = SaveDocument RawDocument (DBAction a) | GetDocuments DocumentFilter ([RawDocument] -> DBAction a) | GetDocumentStats ([(DocId, DocumentStats)] -> DBAction a) | Return a 然后是monad实现: instance Monad DBAction where […]