While I wasn't really confident this was the correct, it was enough to start messing with the type constraints of the instance and trying to get it to compile. Looking at:

instance mapRecordCons :: ( IsSymbol name , RowCons name a trash row , MapRecord tail row a b tailRow' , RowLacks name tailRow' , RowCons name b tailRow' row' ) => MapRecord ( Cons name a tail ) row a b row' where

Changes I needed to do could be summarized like this:

MapRecord becomes SequenceRecord

becomes instead of tracking a -> b in the typeclass, I am tracking Applicative m , so a b becomes m

in the typeclass, I am tracking , so becomes I need to add the Applicative m constraint, so that I am able to use <*> in the implementation

constraint, so that I am able to use in the implementation I needed to track the type of the applicative and inside the applicative in the rows themselves, so standalone a becomes (m ty) and standalone b becomes ty

so in the end I ended up with:

instance sequenceRecordCons :: ( IsSymbol name , Applicative m , RowCons name ( m ty ) trash row , SequenceRecord tail row tailRow' m , RowLacks name tailRow' , RowCons name ty tailRow' row' ) => SequenceRecord ( Cons name ( m ty ) tail ) row m row' where

This actually works and is just one step to create the real sequenceRecord function, that figures out the RowList for you, but before I show that I need to admit that I am doing this write-up with the famous 20:20 hindsight.

In reality I didn't actually start with modifications of mapRecord , but with eqRecord . It took me around an hour to realize, that mapRecord would be a better template. I realized out that adding the Applicative constraint to mapRecord is simpler than figuring out how to build-up the output row’ when starting with eqRecord. Even then, it probably contributed to several of the errors I made along the way.