Implementing `dropJ` to Drop `JoinList` Elements
It's fine, but you have a bug in the Append case, as you completely disregard the right part of the tree:

dropJ i (Append _ left right) 
  | i &gt;= leftHt               = dropJ (i-leftHt) right
  | otherwise                 = dropJ i left              -- where is right?
    where leftHt = (getSize. size . tag) left


You can fix this if you use +++ here again:

dropJ i (Append _ left right) 
  | i &gt;= leftHt               = dropJ (i-leftHt) right
  | otherwise                 = dropJ i left +++ right
    where leftHt = (getSize. size . tag) left


Other than that we could argue about formatting, but your code is fine. It works. Note that you should add more test cases though. A Arbitrary a =&gt; Gen (JoinList m a) generator might come in handy for QuickCheck, but that's left as an exercise.